【问题标题】:Is multiple inheritance possible in VB .Net?VB .Net 中是否可以进行多重继承?
【发布时间】:2010-09-25 23:02:22
【问题描述】:

VB .Net 中是否可以进行多重继承?如果有,语法是什么?

【问题讨论】:

    标签: vb.net inheritance multiple-inheritance


    【解决方案1】:

    简短回答:否

    稍微长一点的答案:是的,如果您继承多个接口和一个基类。由于这通常是 MI 的原因(您想实现多个接口),因此通常就足够了。但是,在“真正的” MI 有用的极少数情况下,.NET 会阻止您这样做。

    【讨论】:

    • @Orion Edwards:怎么不是?继承定义了“是”关系,接口是定义对象“是”的一种方式。如果我继承 ISerializable,我是在说“我是一个 ISerializable”,并将我视为一个 ISerializable 按预期工作。
    • 在@Harper Shelby 的评论中,自愿应用这种限制通常被视为 C++ 中的最佳实践(而不是使用纯抽象基类的接口)。
    • @HarperShelby Inheritance 也是您继承预定义代码的时候。它产生相同的结果。实现接口意味着您仍然必须在预定义的方法中编写代码。虽然接口仍然具有相同的签名,但它们可以包含完全不同的代码并产生不同的结果。所以不,这不是继承。对不起。
    • @DavidWilson ,我认为您人为地限制了继承的定义。我在不止一次使用过模板方法之类的模式,其中 some 代码被重用,但其他位不仅没有被重用,而且没有故意在基类中定义。这两个子类肯定都继承自基类,但实现和结果却大不相同。
    【解决方案2】:

    在 VB.Net 中可以像在 C# 中一样以受限的方式:通过接口。由于接口本质上是一个纯抽象基类,因此您可以从任意数量的接口和一个真实类继承。

    【讨论】:

      【解决方案3】:

      您可能真正想做的是组合或聚合(请参阅here for design pattern)。也许您正在定义一种行为。您始终可以在基类中实现接口 SomeInterface,拥有 SomeInterface 类型的成员(它允许它是实现 SomeInterface 的任何类,因此可以让代码执行实现),在成员构造函数中传递对基类的引用必要时拥有它(如果这样做,请尝试添加另一个接口来定义回调,基类将实现它,子类将其作为成员变量类型)。使用对成员类的调用来实现 SomeInterface。这样代码是在另一个类中实现的,这样维护起来很容易,但你不会做多重继承。

      组合背后的想法是,引擎不是汽车,而是汽车有引擎。汽车需要一个引擎,但不需要知道整个引擎单元是如何工作的,只需要知道如何与它交互即可。所以引擎不应该从汽车继承。但是让汽车实现引擎是愚蠢的。因此,汽车将发动机作为整个汽车的成员,但作为一个对象。这辆车有一个发动机作为其组成的一部分。

      听起来你正在做的更像是一种行为,就像鸭子对象具有嘎嘎行为一样,但橡皮鸭是鸭子但不会嘎嘎但会发出吱吱声。所以它们与野鸭物体不同,但两者都有许多其他的鸭子特征。所以你想要一个庸医的接口,每个接口都以不同的方式实现。但是很多鸭子都会为这个界面嘎嘎,所以你不想每个都写嘎嘎。这就是你使用组合来实现 quack 行为接口的地方。

      【讨论】:

        【解决方案4】:

        据我所知,VB.net 通常不支持多重继承,但您可以通过使用接口(使用“Implements”而不是“Inherits”)实现一种多重继承:

        Public Class ClassName
            Implements BaseInterface1, BaseInterface2
        
        End Class
        

        这适用于类,但我希望有一个接口继承一些基本接口。类似的东西:

        Public Interface InterfaceName
            Implements BaseInterface1, BaseInterface2
        
        End Interface
        

        但是接口不允许使用“Implements”关键字(当然,这是有道理的)。我尝试使用一种我从 Java 中知道的抽象类:

        Public MustInherit Class InterfaceName
            Implements BaseInterface1, BaseInterface2
        
        End Class
        

        但现在我需要在 InterfaceName 类中实现 BaseInterface1 和 BaseInterface2 中定义的方法。但由于 InterfaceName 也应该是一个接口,我不想在该类中实现这些方法。

        在 C# 中你可以很容易地做到这一点:

        public interface InterfaceName: BaseInterface1, BaseInterface2 {}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-30
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          相关资源
          最近更新 更多