【问题标题】:Using polymorphism on member of interface在接口成员上使用多态性
【发布时间】:2010-10-26 12:16:04
【问题描述】:

好吧,这是一个有点白痴的问题,但我今天遇到了这个问题,这让我有些困惑,为什么会这样。

考虑以下结构

    Public Class Employee
    Implements IPerson

    Private _MyManager As Manager
    Public Property MyManager() As Manager Implements IPerson.TheirLeader
        Get
            Return _MyManager
        End Get
        Set(ByVal value As Manager)
            _MyManager = value
        End Set
    End Property

End Class

Public Class Manager
    Implements IPerson, IAuthorityFigure

    Private _MyBoss As Boss
    Public Property MyBoss() As Boss Implements IPerson.TheirLeader
        Get
            Return _MyBoss
        End Get
        Set(ByVal value As Boss)
            _MyBoss = value
        End Set
    End Property

End Class

Public Class Boss
    Implements IPerson, IAuthorityFigure

    'Implementation code here...

End Class

Public Interface IPerson

    Property TheirLeader() As IAuthorityFigure

End Interface

Public Interface IAuthorityFigure
    'Stuff here...
End Interface

这是我的问题:我想让每个人都实现 IPerson 接口,无论他们是员工、老板还是经理。但是,他们每个人都有一个指向其领导者的属性(员工有经理,经理有老板,等等)。除了他们实现 IAuthorityFigure 接口之外,他们的领导者的每个实现都可能不同。我想让 IPerson 接口有一个 IAuthorityFigure 的属性,但是当我实现这个 b/c 时它会为我抛出一个编译器错误,IAuthorityFigure 与 Boss 或 Manager 的类型不同(即使它们实现了接口)。

所以,我做错了什么,或者这是使用接口与抽象类的限制。如果这是一个限制,谁能解释为什么会这样?

谢谢!

【问题讨论】:

    标签: vb.net inheritance interface


    【解决方案1】:

    你没有做错任何事。在所有当前发布的 Visual Basic(和 C#)版本中,接口的方法、属性或字段的实现必须与接口上的签名完全匹配。没有办法覆盖它。

    您能做的最好的事情是拥有 2 个属性,一个用于实现接口,另一个用于返回实际实现。

    Private _MyBoss As Boss
    Public Property TheirLeader() As IAuthorityFigure Implements IPerson.TheirLeader
        Get
                Return MyBoss
        End Get
        Set(ByVal value As IAuthorityFigure)
                MyBoss = CType(value, IAuthorityFigure)
        End Set
    End Property
    
    Public Property MyBoss As Boos
        Get
                Return _MyBoss
        End Get
        Set(ByVal value As Boss)
                _MyBoss = value
        End Set
    End Property
    

    【讨论】:

    • 好主意 - 我没有想到那种方法。在我的情况下,您是否会使用该技术(尝试想象这样做是否会产生任何后果)。
    • @Nathan,是的,我肯定会在您的情况下使用该技术。当我处理像 Employee 这样的具体实现时,我知道“TheirLeader”是一个经理。我不想在我的代码中添加很多多余的强制转换,所以我做了双重属性。
    • 接口实现属性 (TheirLeader) 设置器应该采用 IAuthorityFigure 并在这种情况下强制转换为 Boss(这不会编译,因为 value 参数的类型不正确)。我个人不太喜欢它,因为它允许发送任何 IAuthorityFigure 并且如果它不是 Boss 实例,它将在运行时中断根据情况,可能 TheyLeader 应该是只读的(它会解决这个问题)。如果不是,则存在一定风险。
    【解决方案2】:

    如果您列出定义 IPerson 接口的代码会有所帮助。但是,我猜您需要将 Manager 和 Boss 转换为 IAuthorityFigure 而不是他们的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多