VB .Net 中是否可以进行多重继承?如果是这样,语法是什么?
4 回答
简短的回答:没有
稍微长一点的答案:是的,如果你继承多个接口和一个基类。由于这通常是 MI 的原因(您想实现多个接口),因此通常就足够了。但是,在“真正的” MI 有用的极少数情况下,.NET 会阻止您这样做。
在 VB.Net 中可以像在 C# 中一样以受限的方式:通过接口。由于接口本质上是一个纯抽象基类,因此您可以从任意数量的接口和一个真实类继承。
您可能想要做的是真正的组合或聚合(请参阅此处了解设计模式)。也许您正在定义一种行为。您始终可以在基类中实现接口 SomeInterface,拥有 SomeInterface 类型的成员(它可以是实现 SomeInterface 的任何类,因此可以让代码执行),在成员构造函数中传递对基类的引用必要时拥有它(如果这样做,请尝试添加另一个接口来定义回调,基类将实现它,子类将其作为成员变量类型)。使用对成员类的调用来实现 SomeInterface。这样代码是在另一个类中实现的,这使得它易于维护,但您并没有进行多重继承。
组合背后的想法是,引擎不是汽车,而是汽车有引擎。汽车需要一个引擎,但不需要知道整个引擎单元是如何工作的,只需要知道如何与它交互即可。所以引擎不应该从汽车继承。但是让汽车实现引擎是愚蠢的。因此,汽车将发动机作为整个汽车的成员,但作为一个对象。这辆车有一个发动机作为其组成的一部分。
听起来你正在做的更像是一种行为,就像鸭子对象有嘎嘎的行为,但橡皮鸭是鸭子但不嘎嘎但吱吱叫。所以它们与野鸭物体不同,但两者都有许多其他的鸭子特征。所以你想要一个庸医的接口,每个接口都以不同的方式实现。但是很多鸭子都会为这个界面嘎嘎,所以你不想每个都写嘎嘎。这就是您使用组合来实现 quack 行为接口的地方。
据我所知,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 {}