Call a method that requires an instance of a derived class, introduced as a base class in VB.NET or C #

I have two objects - "Spaceship" and "Planet", obtained from the base "Obj". I have defined several classes - Circle, Triangle, Rectangle, etc., which all inherit from the Shape class.

For collision detection purposes, I want to give Obj a "form":

Dim MyShape as Shape 

So in the "Spaceship" I can:

 MyShape = new Triangle(blah,blah) 

and in the "Planet" I can:

 MyShape = new Circle(blah,blah) 

I have a method (overloaded several times) that checks for conflicts between different forms, for example:

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

and

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

This works fine when I call a function using derived classes, for example:

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

But when I call it using MyShape, I get an error because the method is passed a “Shape” (not a derived type) for which the method has no overload.

I could solve this by doing something like:

 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 

But that seems messy. Is there a better way?

0
c # class downcasting
source share
2 answers

The way to it is to insert MyActualFunction as a member of the class.

In the shape of:

 Public MustOverride Function MyActualFunction() End Function 

In a circle and a triangle:

 Public Overrides Function MyActualFunction() End Function 

Then name it like this:

 MyShape.MyActualFunction() 

and it will know which function to call.

+1
source share

Polymorphism cannot help you with this, so you have to create a general method with both parameters of type Shape , and then distinguish them inside it:

 Public Function DoCollide(ByRef shape1 As Shape, ByRef shape2 As Shape) As Boolean If TryCast(shape1, Circle) IsNot Nothing And TryCast(shape2, Circle) IsNot Nothing Then Return DoCollide(TryCast(shape1, Circle), TryCast(shape2, Circle)) ElseIf TryCast(shape1, Circle) IsNot Nothing And TryCast(shape2, Triangle) IsNot Nothing Then Return DoCollide(TryCast(shape1, Circle), TryCast(shape2, Triangle)) Else Return False End If End Function 

I would put this function along with all the specialized implementations that do the actual collision detection in my own CollisionDetector class

 Public Class CollisionDetector Public Function DoCollide(ByRef shape1 As Shape, ByRef shape2 As Shape) As Boolean If TryCast(shape1, Circle) IsNot Nothing And TryCast(shape2, Circle) IsNot Nothing Then Return DoCollide(TryCast(shape1, Circle), TryCast(shape2, Circle)) ElseIf TryCast(shape1, Circle) IsNot Nothing And TryCast(shape2, Triangle) IsNot Nothing Then Return DoCollide(TryCast(shape1, Circle), TryCast(shape2, Triangle)) Else Return False End If End Function Public Function DoCollide(ByRef circle1 As Circle, ByRef circle2 As Circle) As Boolean Return True End Function Public Function DoCollide(ByRef circle As Circle, ByRef triangle As Triangle) As Boolean Return True End Function End Class 
0
source share

All Articles