Вызовите метод, для которого требуется экземпляр производного класса, типизированный как базовый класс в VB.NET или C #

У меня есть два объекта -Spaceship» а также "Планета» выведено из базы "Obj», Я определил несколько классов - Круг, Треугольник, Прямоугольник и т. Д., Которые все наследуются от "Форма» Учебный класс.

В целях обнаружения столкновений я хочу дать Obj "форма ":

Dim MyShape as Shape

Так что вSpaceship» Я могу:

MyShape = new Triangle(blah,blah)

И в "Планета» Я могу:

MyShape = new Circle(blah,blah)

У меня есть метод (перегруженный несколько раз), который проверяет наличие столкновений между различными формами, например:

public shared overloads function intersects(byval circle1 as circle, byval circle2 as circle) as boolean

А ТАКЖЕ

public shared overloads function intersects(byval circle as circle, byval Tri as triangle) as boolean

Это прекрасно работает, когда я вызываю функцию, используя производные классы, например:

dim A as new circle(blah, blah)
dim B as new triangle(blah, blah)
return intersects(A,B)

Но когда я вызываю его с помощью MyShape, я получаю ошибку, потому что метод передается "Форма» (а не производный тип), для которого метод не перегружен.

Я мог бы решить это, сделав что-то вроде:

Public Function Translate(byval MyShape1 as Shape, byval MyShape2 as Shape )as boolean
if shape1.gettype = gettype(circle) and shape2.gettype=gettype(circle) then ''//do circle-circle detection
if shape1.gettype = gettype(triangle) and shape2.gettype=gettype(circle) then ''//do triangle-circle detection
End Function

Но это кажется грязным. Есть ли способ лучше?

Ответы на вопрос(2)

Ваш ответ на вопрос