【问题标题】:Use child class for property in an interface implementation在接口实现中为属性使用子类
【发布时间】: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


    【解决方案1】:

    也许你想要

    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
    

    【讨论】:

      猜你喜欢
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2018-07-13
      • 2016-08-20
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多