【问题标题】:How do I use interfaces to provide the same functionality as multiple inheritance (overlapping inheritance)?如何使用接口提供与多重继承(重叠继承)相同的功能?
【发布时间】:2021-05-07 19:51:11
【问题描述】:

我有一个基类,一个类和一个子基类从该基类继承,还有两个从该子基类继承。

Public MustInherit Class Base
    Public Function F1() As Int32
        Return 1
    End Function
End Class

Public Class B1
    Inherits Base
End Class

Public MustInherit Class SubBase
    Inherits Base
    Public Function F2() As Int32
        Return 2
    End Function
End Class

Public Class S1
    Inherits SubBase
End Class

Public Class S2
    Inherits SubBase
    Public Function F3() As Int32
        Return 3
    End Function
End Class

现在需要添加一个新功能 F4。非常复杂:不允许重复代码。

只需要提供给 B1 和 S1。 它不能让 S2 暴露它

有人建议,接口可以提供多重继承,但是如何呢?由于接口不携带实现,我看不到如何使用接口在两个类中实现新功能。你能引导我走向正确的方向吗?

Public Function F4() As Int32
    Return 4
End Function

编辑:重新设计没问题,只要所有显示的功能(而不是更多)都可用于 B1、S1 和 S2(加上新功能 F4 可用于 B1 和 S1,但不能用于 S2) .

【问题讨论】:

  • 如果添加:Public Interface IFunction4 Function F4() As Int32 End Interface 并使 B1 和 S1 Implements IFunction4,S2 将不会实现接口,因此它不会创建方法。不就是这样吗?
  • @Jimi,但是一个接口没有实现。 B1 和 S1 都需要我实际提供一个实现。两次:在 B1 和 S1 中。在示例中它只是Return 4,但在现实中这是一个复杂的故事。代码重复是不行的。
  • 除非S1失去F2或B1获得F2,否则我认为你不能这样做

标签: .net inheritance interface multiple-inheritance


【解决方案1】:

一种可能的解决方案是创建一个强制实现 F4 的接口。

Public Interface I4
    Function F4() As Int32
End Interface

然后一个新类实现该接口。

Public Class S3
    Implements I4
    Public Function F4() As Int32 Implements I4.F4
        Return 4
    End Function
End Class

然后需要 F4 的 2 个类(B1 和 S1)实现 I4,并在函数体中实例化新类 S3 的对象。由于S2不需要F4,所以没有修改。

Public Class B1
    Inherits Base
    Implements I4
    Public Function F4() As Int32 Implements I4.F4
        Dim o3 As New S3
        Return o3.F4
    End Function
End Class

Public Class S1
    Inherits SubBase
    Implements I4

    Public Function F4() As Int32 Implements I4.F4
        Dim o3 As New S3
        Return o3.F4
    End Function
End Class

漂亮优雅?并不真地。按预期工作?是的。

Public Class TestMI
    Public Sub MI()
        Dim b1 As New B1
        Console.WriteLine(b1.F1.ToString)   'From Class Base.
        Console.WriteLine(b1.F4.ToString)   'New F4 from S3 implementing I4.
        Dim s1 As New S1
        Console.WriteLine(s1.F1.ToString)   'From Class Base.
        Console.WriteLine(s1.F2.ToString)   'From Class SubBase.
        Console.WriteLine(s1.F4.ToString)   'New F4 from S3 implementing I4.
        Dim s2 As New S2
        Console.WriteLine(s2.F1.ToString)   'From Class Base.
        Console.WriteLine(s2.F2.ToString)   'From Class SubBase.
        Console.WriteLine(s2.F3.ToString)   'Native to S2.
        '                                    No exposure of F4, as intended.
    End Sub
End Class

不过,我更喜欢多重继承。

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 2021-06-23
    • 2017-03-24
    • 2012-05-13
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多