Mehrfachvererbung

Mehrfachvererbung ist eine Eigenschaft von einigen objektorientierten Computerprogrammiersprachen, auf denen eine Klasse Handlungsweisen und Eigenschaften von mehr als einer Superklasse erben kann.

Sprachen, die Mehrfachvererbung unterstützen, schließen ein: C ++, Allgemeines Lispeln (über Common Lisp Object System (CLOS)), EuLisp (über Das Gegenstand-System von EuLisp TELOS), Locke, Dylan, Eiffel, Logtalk, Gegenstand REXX, Scala (über den Gebrauch von mixin Klassen), OCaml, Perl, Perl 6, Pythonschlange und Tcl (über Zusätzlichen Tcl (Incr Tcl)).

Einige objektorientierte Sprachen, solcher als C#, Java, und Ruby führen einzelnes Erbe durch, obwohl Protokolle oder Schnittstellen, etwas von der Funktionalität der wahren Mehrfachvererbung zur Verfügung stellen.

Andere objektorientierte Sprachen, wie PHP führen Charakterzug-Klasse durch, die verwendet wird, um vielfache Funktionen zu erben.

Übersicht

In der objektorientierten Programmierung (OOP) beschreibt Erbe eine Beziehung zwischen zwei Typen oder Klassen von Gegenständen, in denen, wie man sagt, ein Subtyp oder Kind vom anderen ist. Das Kind erbt Eigenschaften des Elternteils, geteilte Funktionalität berücksichtigend. Zum Beispiel könnte man ein variables Klassensäugetier mit Eigenschaften wie das Essen, Reproduzieren usw. schaffen; dann definieren Sie einen Subtyp Cat, die jene Eigenschaften erbt, ohne sie ausführlich programmieren zu müssen, während sie neue Eigenschaften wie nachjagende Mäuse hinzufügt.

Wenn, jedoch, man mehr als eine völlig orthogonale Hierarchie gleichzeitig, wie das Erlauben von Cat verwenden will, vom Cartoon-Charakter und Haustier und Säugetier zu erben, von der Mehrfachvererbung zu fehlen, häufig läuft auf eine sehr ungeschickt Mischhierarchie hinaus, oder zwingt Funktionalität, in mehr als einem Platz mit begleitenden Wartungsproblemen umgeschrieben zu werden.

Mehrfachvererbung ist ein empfindliches Problem viele Jahre lang mit Gegnern gewesen, die zu seiner vergrößerten Kompliziertheit und Zweideutigkeit in Situationen wie das Diamantproblem hinweisen.

Sprachen haben verschiedene Weisen, sich mit diesen Problemen des wiederholten Erbes zu befassen.

  • C ++ verlangt das Angeben ausführlich, welche Elternteilklasse die zu verwendende Eigenschaft von d. h. "Arbeiter angerufen wird:: Mensch. Alter". C ++ unterstützt ausführliches wiederholtes Erbe nicht, da es keine Weise geben würde, sich der Superklasse zu qualifizieren, zu verwenden (sieh Kritiken). C ++ erlaubt auch einem einzelnen Beispiel der vielfachen Klasse, über den virtuellen Erbe-Mechanismus geschaffen zu werden (d. h. "Arbeiter:: Menschlicher" und "Musiker:: Mensch" wird in demselben Gegenstand Verweise anbringen).
  • Das Allgemeine Lispeln-Gegenstand-System erlaubt volle Kontrolle der Methode-Kombination, und wenn das nicht genug ist, gibt das metaobject Protokoll ein Mittel, das Erbe, die dynamische Absendung, Klasse instantiation und andere innere Mechanismen zu modifizieren, ohne die Stabilität des Systems zu betreffen.
  • Locke erlaubt nur Klassen, die, wie geteilt, ausführlich gekennzeichnet werden, um wiederholt geerbt zu werden. Geteilte Klassen müssen einen sekundären Konstrukteur für jeden regelmäßigen Konstrukteur in der Klasse definieren. Der regelmäßige Konstrukteur wird das erste Mal genannt, wenn der Staat für die geteilte Klasse durch einen Unterklasse-Konstrukteur initialisiert wird, und der sekundäre Konstrukteur für alle anderen Unterklassen angerufen wird.
  • Eiffel erlaubt ausführlich, Eigenschaften sich anzuschließen oder sie zu trennen, die von Superklassen geerbt werden. Eiffel wird sich Eigenschaften zusammen automatisch anschließen, wenn sie denselben Namen und Durchführung haben. Der Klassenschriftsteller hat die Auswahl, die geerbten Eigenschaften umzubenennen, um sie zu trennen. Eiffel erlaubt auch ausführliches wiederholtes Erbe wie A: B, B.
  • Logtalk unterstützt sowohl Schnittstelle als auch Durchführungsmehrerbe, die Behauptung von Methode-Decknamen erlaubend, die sowohl Umbenennung als auch Zugang zu Methoden zur Verfügung stellen, die durch den Verzug-Konfliktentschlossenheitsmechanismus maskiert würden.
  • OCaml wählt die letzte zusammenpassende Definition einer Klassenerbe-Liste, um sich der Methode-Durchführung aufzulösen, unter Zweideutigkeiten zu verwenden. Um das Verzug-Verhalten zu überreiten, qualifiziert man einfach einen Methode-Anruf mit der gewünschten Klassendefinition.
  • Perl verwendet die Liste von Klassen, um von als eine geordnete Liste zu erben. Der Bearbeiter verwendet die erste Methode, die es durch die Tiefe findet, die zuerst von der Superklassenliste sucht oder C3 linearization der Klassenhierarchie verwendet. Verschiedene Erweiterungen stellen alternative Klassenzusammensetzungsschemas zur Verfügung. Die Ordnung des Erbes betrifft die Klassensemantik (sieh Kritiken).
  • Pythonschlange hat dieselbe Struktur, wie Perl, aber verschieden von Perl es in die Syntax der Sprache einschließt. Die Ordnung des Erbes betrifft die Klassensemantik (sieh Kritiken).
  • Scala erlaubt vielfachen instantiation von Charakterzügen, der Mehrfachvererbung durch das Hinzufügen einer Unterscheidung zwischen der Klassenhierarchie und der Charakterzug-Hierarchie berücksichtigt. Eine Klasse kann nur von einer einzelnen Klasse erben, aber kann sich - in so vielen Charakterzügen vermischen wie gewünscht.
  • Tcl erlaubt vielfache Elternteilklassen - ihre Reihe betrifft die Namenentschlossenheit für Klassenmitglieder.

Einzelnes Erbe

Eine Weise, diese Probleme aufzulösen, ist gewesen, einzelnes Erbe geltend zu machen, wo eine Klasse nur auf eine Grundklasse zurückzuführen sein kann. Normalerweise erlauben diese Sprachen Klassen, vielfache Protokolle, genannt Schnittstellen in Java durchzuführen. Diese Protokolle definieren Methoden, aber stellen konkrete Durchführungen nicht zur Verfügung. Diese Strategie ist von ActionScript, C#, D, Java, Nemerle, Object Pascal (Delphi), Ziel-C, Rubin und Plausch verwendet worden. Alle außer dem Plausch erlauben Klassen, vielfache Protokolle durchzuführen.

Kritiken

Mehrfachvererbung ist von einigen für seine unnötige Kompliziertheit kritisiert worden und zu sein, der schwierig ist, effizient durchzuführen, obwohl einige Projekte sicher aus seinem Gebrauch einen Nutzen gezogen haben. Zum Beispiel hat Java und C# keine Mehrfachvererbung, weil die Sprachentwerfer gefunden haben, dass es unnötige Kompliziertheit hinzufügen würde.

Die Mehrfachvererbung auf Sprachen mit C ++ und mit Java artige Konstrukteure verschlimmert das Erbe-Problem von Konstrukteuren und Konstrukteur, der dadurch kettet, Wartung und Dehnbarkeitsprobleme auf diesen Sprachen schaffend. Gegenstände in der Erbe-Beziehung mit sehr unterschiedlichen Baumethoden sind hart, unter dem Konstrukteur kettenden Paradigma durchzuführen.

Kritiken für die Probleme, die es auf bestimmten Sprachen, in besonderem C ++ verursacht, sind:

  • Semantische Zweideutigkeit hat häufig als das Diamantproblem (obwohl lösbar, durch das Verwenden virtuellen Erbes oder 'das Verwenden' von Behauptungen) zusammengefasst.
  • Unfähigkeit, mehrmals von einer einzelnen Klasse ausführlich zu erben (andererseits wird diese Eigenschaft als nichtobjektorientiert kritisiert).
  • Die Ordnung des Erbes, das Klassensemantik ändert (obwohl es dasselbe mit der Ordnung von Feldbehauptungen ist).
  • Mehrfachvererbungslösungen können häufig durch Schnittstellen oder Zusammensetzung ersetzt werden

Siehe auch

  • Durchführungserbe
  • Charakterzug-Klasse
  • Virtuelles Erbe
  • Mixin
  • C3 linearization
  • Geleiteter Graph

Weiterführende Literatur

  • Stroustrup, Bjarne (1999). Mehrfachvererbung für C ++. Verhandlungen des Frühlings 1987 Konferenz von European Unix Users Group.
  • Objektorientierter Softwareaufbau, die Zweite Ausgabe, durch Bertrand Meyer, Prentice Hall, 1997, internationale Standardbuchnummer 0-13-629155-4

Außenverbindungen


Masochismus / Mediastudien
Impressum & Datenschutz