在接口实现中使用子类作为属性

时间:2014-12-05 08:19:16

标签: vb.net inheritance interface subclass

给出一个班级

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必须是“游泳”,而不是通用的MovementType。

我在我的示例中遇到的问题当然是FlyingObject没有实现IMovingObject,因为mType没有在Interface中指定的Type“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()

尽管使用直接演员并不是一个可行的解决方案。实现这个的“正确”方法是什么?

请注意,上面的代码只是一个示例,忽略了不寻常的命名约定,以及赋予类型“潜水”或“降落”能力没有意义的事实。我只想给你一些代码来处理:)

1 个答案:

答案 0 :(得分:0)

也许你想要

Public Interface IMover(Of Out TMovementType As MovementType)
    Property MovementType As TMovementType
    Sub Move()
End Interface

会导致

Public class FlyingObject
    Implements IMover<Flying>

    Property MovementType As Flying

    Public Sub Move()
        Me.MovementType.Move()
    End Sub
End Class