【发布时间】:2012-10-23 06:31:17
【问题描述】:
我有两个对象——从基础“Obj”派生的“Spaceship”和“Planet”。我定义了几个类——圆形、三角形、矩形等,它们都继承自“形状”类。
出于碰撞检测的目的,我想给 Obj 一个“形状”:
Dim MyShape as Shape
所以在“宇宙飞船”中我可以:
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 调用它时,我收到一个错误,因为该方法正在传递一个“Shape”(而不是派生类型),该方法没有重载。
我可以通过以下方式解决它:
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
但这似乎很混乱。有没有更好的办法?
【问题讨论】:
-
更改方法参数,它应该采用Shape对象,而不是Concrete child (C#)
-
#2 很抱歉您无法理解这个问题。我实际上认为“子对象”和“派生类”或多或少是一回事。也许您会很友好地解释两者之间的区别以及您认为我应该在这种特殊情况下使用哪个?我只创建了“Shape”类来将形状组合在一起,这样我就可以使用
Dim MyShape as Shape来覆盖所有可能的形状。 -
@JesseJames ATM 我实际上使用了一个重载方法,它根据传递给它的两个形状做不同的事情。例如,如果我传递一个圆形和一个三角形,它实际上会调用与传递两个圆形不同的方法。对不起,我只是试图简化情况以使问题更容易理解。
-
@Gravitate 我倾向于将 子对象 理解为关联。而派生类是继承基类的类。
-
@MatíasFidemraizer 有什么功能上的区别吗? “子对象”可以访问其“父对象”属性,就像派生类可以访问其基属性一样,不是吗?我想你可以通过使用“Parent.Child”来引用一个孩子,但你不能对“Base.Derived”做同样的事情。必须有更根本的区别......我将不得不问无所不知的谷歌:)
标签: c# .net vb.net class downcast