17 Stimmen

Ist Mehrfachvererbung in VB.Net möglich?

Ist Mehrfachvererbung in VB .Net möglich? Wenn ja, wie lautet die Syntax?

20voto

Harper Shelby Punkte 16295

Kurze Antwort: Nein

Eine etwas längere Antwort: Ja, wenn Sie mehrere Schnittstellen und eine einzige Basisklasse erben. Da dies in der Regel der Grund für MI ist (Sie wollen mehrere Schnittstellen implementieren), ist dies normalerweise ausreichend. In den seltenen Fällen, in denen eine "echte" MI nützlich ist, verhindert .NET jedoch, dass Sie dies tun können.

0 Stimmen

@Orion Edwards: Wie kann das nicht sein? Vererbung definiert eine "ist ein"-Beziehung, und Schnittstellen sind eine Möglichkeit zu definieren, was ein Objekt "ist". Wenn ich ISerializable erbe, sage ich: "Ich bin ein ISerializable", und mich als ISerializable zu behandeln, funktioniert wie erwartet.

0 Stimmen

Zu dem Kommentar von @Harper Shelby ist anzumerken, dass eine freiwillige Anwendung dieser Art von Beschränkung in der Regel als beste Praxis in C++ angesehen wird (anstelle von Schnittstellen würden Sie reine abstrakte Basisklassen haben).

0 Stimmen

@HarperShelby Vererbung bedeutet, dass man den vordefinierten Code ebenfalls erbt, was zu den gleichen Ergebnissen führt. Die Implementierung von Schnittstellen bedeutet, dass man den Code in den vordefinierten Methoden noch schreiben muss. Die Schnittstellen haben zwar immer noch die gleichen Signaturen, können aber völlig unterschiedlichen Code enthalten und unterschiedliche Ergebnisse liefern. Also nein, das ist keine Vererbung. Entschuldigung.

4voto

Joel Coehoorn Punkte 377088

In VB.Net ist dies in eingeschränkter Weise möglich, genauso wie in C#: über Interfaces. Da eine Schnittstelle im Wesentlichen eine rein abstrakte Basisklasse darstellt, können Sie von so vielen Interfaces erben, wie Sie benötigen, und von einer echten Klasse.

2voto

user1954025 Punkte 11

Soweit ich weiß, unterstützt VB.net keine Mehrfachvererbung im Allgemeinen, aber man kann eine Art von Mehrfachvererbung erreichen, indem man mit Schnittstellen arbeitet (unter Verwendung von "Implements" anstelle von "Inherits"):

Public Class ClassName
    Implements BaseInterface1, BaseInterface2

End Class

Das funktioniert gut für Klassen, aber ich würde gerne eine Schnittstelle haben, die einige Basisschnittstellen erbt. So etwas wie das:

Public Interface InterfaceName
    Implements BaseInterface1, BaseInterface2

End Interface

Aber das Schlüsselwort "Implements" ist für Schnittstellen nicht erlaubt (was natürlich sinnvoll ist). Ich habe versucht, eine Art abstrakte Klasse zu verwenden, die ich aus Java kenne:

Public MustInherit Class InterfaceName
    Implements BaseInterface1, BaseInterface2

End Class

Aber jetzt muss ich die definierten Methoden von BaseInterface1 und BaseInterface2 innerhalb der Klasse InterfaceName implementieren. Da InterfaceName aber auch eine Schnittstelle sein sollte, möchte ich diese Methoden nicht in dieser Klasse implementieren müssen.

In C# können Sie das ganz einfach tun:

public interface InterfaceName: BaseInterface1, BaseInterface2 {}

1voto

VoteCoffee Punkte 3834

Wahrscheinlich ist das, was Sie tun wollen, wirklich eine Komposition oder Aggregation ( siehe hier für Entwurfsmuster ). Vielleicht definieren Sie ein Verhalten. Sie können immer eine Schnittstelle SomeInterface in der Basisklasse implementieren, haben ein Mitglied vom Typ SomeInterface (die es jede Klasse, die SomeInterface implementiert und kann daher den Code tut die Umsetzung), in der Mitglieder Konstruktor übergeben einen Verweis auf die Basisklasse, die es besitzt, wenn nötig (wenn dies zu tun, versuchen Sie, eine andere Schnittstelle hinzufügen, um die Rückrufe zu definieren, die Basisklasse wird es zu implementieren und die Unterklasse wird es als Mitglied Variable Typ). Verwenden Sie Aufrufe an die Mitgliedsklasse, um SomeInterface zu implementieren. Auf diese Weise wird der Code in einer anderen Klasse implementiert, was die Wartung vereinfacht, aber Sie führen keine Mehrfachvererbung durch.

Die Idee hinter der Komposition ist, dass ein Motor kein Auto ist, aber ein Auto hat einen Motor. Das Auto braucht einen Motor, muss aber nicht wissen, wie eine ganze Motoreinheit funktioniert, sondern nur, wie man mit ihr zusammenarbeitet. Der Motor sollte also nicht vom Auto erben. Aber dass das Auto den Motor implementiert, ist dumm. Also bekommt das Auto einen Motor als Mitglied des ganzen Autos, aber als Objekt. Das Auto hat einen Motor als Teil seiner Komposition.

Es klingt, als wäre das, was Sie tun, eher ein Verhalten, wie ein Entenobjekt, das ein Quakverhalten hat, aber Gummienten sind Enten, die nicht quaken, sondern quieken. Sie unterscheiden sich also von Stockentenobjekten, haben aber viele andere Enteneigenschaften gemeinsam. Man möchte also eine Quak-Schnittstelle haben, die jede Ente anders implementiert. Aber viele Enten werden für diese Schnittstelle quaken, also möchte man nicht für jede einzelne ein Quaken schreiben müssen. An dieser Stelle verwenden Sie die Komposition, um die Schnittstelle für das Quakverhalten zu implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X