【发布时间】:2015-02-03 08:50:00
【问题描述】:
给定一个班级
public class MovementType
Public Sub Move()
//Move around
End Sub
End class
还有一个界面
public Interface IMovingObject
Property mType As MovementType
Sub Move()
End Interface
我想为 MovementType 的不同子类提供几个此接口的实现。例如,我想为以下每个子类实现 IMovingObject,其中我将 mType 设置为这些类的实例。
public class Swimming
Inherits MovementType
public Sub dive()
//breathe
//dive
End Sub
End class
或
public class Flying
Inherits MovementType
public Sub land()
//catch CanNotLandOnLavaException
End Sub
End class
因此我想创建这样的东西:
public class FlyingObject
Implements IMovingObject
Property mType As Flying
public Sub Move()
mType.Move()
End Sub
End class
我想要这样的设置的原因是我希望能够使用相同的界面来管理 FlyingObjects 和 SwimmingObjects 以移动它们。但是在某些情况下,当我有 IMovingObject 的具体实现时,我需要调用特定的方法(例如 SwimmingObject 的 mType.dive())。因此,对于 SwimmingObject,mType 必须是“Swimming”,而不是通用的 MovementType。
我在示例中遇到的问题当然是 FlyingObject 没有实现 IMovingObject,因为 mType 没有接口中指定的类型“MovementType”。
一种可能的解决方案是将 mType 设置为“Flying”的实例
public class FlyingObject
Implements IMovingObject
Property mType As MovementType
Public Sub New()
mType = New Flying()
End Sub
public Sub Move()
mType.Move()
End Sub
End class
然后我可以使用
从任何地方调用land() 方法Ctype(mtype,Flying).land()
在所有地方使用直接强制转换似乎不是一个可行的解决方案。实现这一点的“正确”方法是什么?
请注意,上面的代码只是一个示例,忽略了不寻常的命名约定以及赋予类型“潜水”或“着陆”的能力是没有意义的事实。我只是想在这里给你一些代码:)
【问题讨论】:
标签: vb.net inheritance interface subclass