Vererbung (objektorientierte Programmierung)
Im Objekt orientierte Programmierung, Nachlass ist der Mechanismus des Basis einer Objekt oder Klasse auf ein anderes Objekt (Prototypbasierte Vererbung) oder Klasse (Klassenbasierte Vererbung), ähnlich beibehalten Implementierung. Auch definiert als Ableitungen neuer Klassen (Unterschicht) von vorhandenen wie Super Class oder Basisklasse und dann in eine Hierarchie von Klassen zu formen. In den meisten klassenbasierten objektorientierten Sprachen erhält ein Objekt, das durch Vererbung erstellt wurde, ein "Kinderobjekt", alle Eigenschaften und Verhalten des "Elternobjekts", mit Ausnahme von: Konstrukteure, Destruktor, überlastete Operatoren und Freundfunktionen der Basisklasse. Die Vererbung ermöglicht es den Programmierern, Klassen zu erstellen, die auf vorhandenen Klassen basieren.[1] Um eine neue Implementierung anzugeben und gleichzeitig die gleichen Verhaltensweisen beizubehalten (Realisierung einer Schnittstelle), um Code wiederzuverwenden und unabhängig voneinander die Originalsoftware über öffentliche Klassen zu erweitern und Schnittstellen. Die Beziehungen von Objekten oder Klassen durch Vererbung führen zu a Regie acyclische Graphen.
Erbschaft wurde 1969 für erfunden Simula[2] und wird jetzt in vielen objektorientierten Programmiersprachen verwendet, wie z. Java, C ++, Php und Python.
Eine ererbte Klasse heißt a Unterklasse seiner Elternklasse oder Superklasse. Der Begriff "Vererbung" wird sowohl für klassenbasierte als auch für prototypbasierte Programmierung locker verwendet, aber bei enger Verwendung ist der Begriff für klassenbasierte Programme reserviert (eine Klasse Erben von ein anderer) mit der entsprechenden Technik in prototypbasierter Programmierung stattdessen aufgerufen Delegation (ein Objekt Delegierte zu Ein weiterer).
Vererbung sollte nicht miteinander verwechselt werden Subtyping.[3][4] In einigen Sprachen werden Erbschaft und Subtyping einverstanden,[a] während sie sich in anderen unterscheiden; Im Allgemeinen legt das Subtyping eine fest ist ein Beziehung, während die Vererbung nur die Umsetzung wiederverwendet und eine syntaktische Beziehung herstellt, nicht unbedingt eine semantische Beziehung (Vererbung sorgt nicht für Verhaltensuntertypen). Um diese Konzepte zu unterscheiden, wird das Subtyping manchmal als bezeichnet Schnittstellenvererbung (ohne zu erkennen, dass die Spezialisierung von Typvariablen auch eine subtypende Beziehung induziert), während die hier definierte Vererbung als genannt wird als Implementierung Vererbung oder Code -Vererbung.[5] Die Vererbung ist jedoch ein häufig verwendeter Mechanismus zur Aufstellung von Subtyp -Beziehungen.[6]
Vererbung steht im Gegensatz zu Objektzusammensetzung, wo ein Objekt enthält ein anderes Objekt (oder Objekte einer Klasse enthalten Objekte einer anderen Klasse); sehen Zusammensetzung über die Vererbung. Komposition implementiert a hat ein Beziehung im Gegensatz zum IS-A-Verhältnis von Subtyping.
Typen
Es gibt verschiedene Arten der Vererbung, die auf Paradigma und spezifischer Sprache basieren.[7]
- Einzelvererbung
- Wo Unterklassen die Merkmale einer Superklasse erben. Eine Klasse erwirbt die Eigenschaften einer anderen Klasse.
- Mehrfacherbe
- Wo eine Klasse mehr als eine Superklasse und Erbenfunktionen aus allen übergeordneten Klassen haben kann.
-
"Multiple Vererbung ... sollte sehr schwierig sein, effizient zu implementieren. Zum Beispiel in einer Zusammenfassung von C ++ in seinem Buch on Ziel c, Brad Cox Eigentlich behauptete, dass das Hinzufügen mehrerer Vererbung zu C ++ unmöglich war. Somit schien die multiple Erbe eher eine Herausforderung zu sein. Seit ich 1982 bereits 1982 mit mehreren Erbschaften nachgedacht hatte und 1984 eine einfache und effiziente Implementierungstechnik gefunden hatte, konnte ich der Herausforderung nicht widerstehen. Ich vermute, dass dies der einzige Fall ist, in dem die Mode die Abfolge der Ereignisse beeinflusste. "[8]
- Mehrebenenvererbung
- wo eine Unterklasse von einer anderen Unterklasse geerbt wird. Es ist nicht ungewöhnlich, dass eine Klasse von einer anderen abgeleiteten Klasse abgeleitet ist, wie in der Abbildung "mehrstufiger Vererbung" gezeigt.
- Die Klasse A dient als a Basisklasse für die abgeleitete Klasse B, was wiederum als dient als Basisklasse für die abgeleitete Klasse C. Die Klasse B ist bekannt als dazwischenliegend Basisklasse, da es einen Link für die Vererbung zwischen der Vererbung bietet A und C. Die Kette ABC ist bekannt als Vererbungsweg.
- Eine abgeleitete Klasse mit mehrstufiger Vererbung wird wie folgt erklärt:
Klasse A { ... }; // Basisklasse Klasse B : Öffentlichkeit A { ... }; // b abgeleitet von a Klasse C : Öffentlichkeit B { ... }; // c abgeleitet von b
- Dieser Prozess kann auf eine beliebige Anzahl von Ebenen erweitert werden.
- Hierarchische Erbe
- Hier dient eine Klasse als Superklasse (Basisklasse) für mehr als eine Unterklasse. Zum Beispiel kann eine übergeordnete Klasse A, A, zwei Unterklassen B und C haben. Sowohl B- als auch C -Elternklasse von A, aber B und C sind zwei separate Unterklassen.
- Hybridvererbung
- Hybriderbschaft ist, wenn eine Mischung aus zwei oder mehr der oben genannten Vererbungsarten auftritt. Ein Beispiel hierfür ist, wenn die Klasse A eine Unterklasse B hat, die zwei Unterklassen hat, C und D. Dies ist eine Mischung aus mehrstufiger Vererbung und hierarchaler Vererbung.
Unterklassen und Superklassen
Unterklassen, abgeleitete Klassen, Erbenklassen, oder Kinderklassen sind modular Derivatklassen, die einen oder mehrere erbt Sprache Entitäten aus einem oder mehreren anderen Klassen (genannt Superklasse, Basisklassen, oder Elternklassen). Die Semantik des Unterrichtsvererbes variiert von Sprache zu Sprache, aber üblicherweise erbt die Unterklasse automatisch die Instanzvariablen und Mitgliedsfunktionen seiner Superklassen.
Die allgemeine Form der Definition einer abgeleiteten Klasse lautet:[9]
Klasse Unterklasse: Sichtweite Superklasse { // Subklassenmitglieder };
- Der Dickdarm gibt an, dass die Unterklasse von der Superklasse erbt. Die Sichtbarkeit ist optional und kann, falls vorhanden, entweder sein Privatgelände oder Öffentlichkeit. Die Standardsicht ist Privatgelände. Sichtbarkeit gibt an, ob die Merkmale der Basisklasse sind privat abgeleitet oder öffentlich abgeleitet.
Einige Sprachen unterstützen auch die Vererbung anderer Konstrukte. Zum Beispiel in Eiffel, Verträge Das definiert die Spezifikation einer Klasse wird auch von Erben geerbt. Die Superklasse stellt eine gemeinsame Schnittstelle und Grundfunktionalität fest, die spezialisierte Unterklassen erben, modifizieren und ergänzen können. Die von einer Unterklasse geerbte Software wird berücksichtigt wiederverwendet in der Unterklasse. Ein Hinweis auf eine Instanz einer Klasse kann sich tatsächlich auf eine seiner Unterklassen beziehen. Die tatsächliche Klasse des verwiesenen Objekts ist nicht vorherzusagen Kompilierungszeit. Eine einheitliche Schnittstelle wird verwendet, um die Mitgliederfunktionen von Objekten einer Reihe verschiedener Klassen aufzurufen. Unterklassen können Superklassenfunktionen durch völlig neue Funktionen ersetzen, die dasselbe teilen müssen Methodensignatur.
Nicht-subklassierbare Klassen
In einigen Sprachen kann eine Klasse als deklariert werden als als Nicht-Subklassierbar Durch Hinzufügen bestimmter Klassenmodifikatoren zur Klassenerklärung. Beispiele sind die Finale
Schlüsselwort in Java und C ++ 11 voran oder der versiegelt
Schlüsselwort in C#. Solche Modifikatoren werden der Klassenerklärung vor dem hinzugefügt Klasse
Schlüsselwort und die Erklärung der Klassenkennung. Solche nicht-subklassierbaren Klassen beschränken sich Wiederverwendbarkeitinsbesondere wenn Entwickler nur Zugang zu vorkompiliert haben Binärdateien und nicht Quellcode.
Eine nicht subklassierbare Klasse hat keine Unterklassen, sodass sie leicht abgeleitet werden kann Zeit kompilieren dass Referenzen oder Zeiger auf Objekte dieser Klasse tatsächlich an Instanzen dieser Klasse und nicht auf Fälle von Unterklassen (sie existieren nicht) oder Instanzen von Superklassen (nicht existieren) verweisen (sie existieren nicht)Upcast Ein Referenztyp verstößt gegen das Typsystem). Weil der genaue Typ des verwiesenen Objekts vor der Ausführung bekannt ist, Frühe Bindung (auch genannt statischer Versand) kann anstelle von verwendet werden späte Bindung (auch genannt Dynamischer Versand), was einen oder mehrere erfordert Virtuelle Methode Tabelle SOKAUPS, je nachdem, ob Mehrfacherbe oder nur Einzelvererbung werden in der Programmiersprache unterstützt, die verwendet wird.
Nicht überholbare Methoden
So wie Klassen möglicherweise nicht subklassierbar sind, können Methodendeklarationen Methodenmodifikatoren enthalten, die verhindern, dass die Methode überschrieben wird (d. H. Ersetzt durch eine neue Funktion mit demselben Namen und Typ Signatur in einer Unterklasse). EIN Privatgelände Die Methode ist einfach nicht übermäßig, weil sie nicht nach Klassen als der Klasse zugänglich ist, die eine Mitgliedsfunktion von (dies gilt jedoch nicht für C ++). EIN Finale
Methode in Java, a versiegelt
Methode in C# oder a gefroren
Feature in Eiffel kann nicht außer Kraft gesetzt werden.
Virtuelle Methoden
Wenn die Superklassenmethode a ist Virtuelle Methodedann werden die Bevölkerung der Superklassenmethode sein dynamisch versandt. Einige Sprachen erfordern, dass Methoden speziell als virtuell deklariert werden (z. B. C ++), und in anderen anderen sind alle Methoden virtuell (z. B. Java). Eine Aufruf einer nicht virtuellen Methode wird immer statisch versandt (d. H. Die Adresse des Funktionsaufrufs wird zur Kompilierungszeit bestimmt). Der statische Versand ist schneller als der dynamische Versand und ermöglicht Optimierungen wie z. Inline -Expansion.
Sichtbarkeit ererbter Mitglieder
Die folgende Tabelle zeigt, welche Variablen und Funktionen von der Sichtbarkeit bei der Ableitung der Klasse abhängig werden.[10]
Sichtbarkeit der Basisklasse | Abgeleitete Klassensichtbarkeit | ||
---|---|---|---|
Öffentliche Ableitung | Private Ableitung | Geschützte Ableitung | |
|
|
|
|
Anwendungen
Die Vererbung wird verwendet, um zwei oder mehr Klassen miteinander verbunden zu sein.
Überschreiben
Viele objektorientierte Programmiersprachen Ermöglichen Sie, dass eine Klasse oder ein Objekt die Implementierung eines Aspekts ersetzt - typischerweise ein Verhalten -, das sie geerbt hat. Dieser Prozess wird genannt überschreiben. Übergeordnet wird eine Komplikation eingeführt: Welche Version des Verhaltens ist eine Instanz der ererbten Klassenverwendung - diejenige, die Teil seiner eigenen Klasse ist, oder die von der übergeordneten (Basis-) Klasse? Die Antwort variiert zwischen den Programmiersprachen, und einige Sprachen bieten die Möglichkeit, anzuzeigen, dass ein bestimmtes Verhalten nicht außer Kraft gesetzt werden und sich wie von der Basisklasse definiert verhalten sollte. Beispielsweise kann in C#die Basismethode oder Eigenschaft nur in einer Unterklasse überschrieben werden, wenn sie mit dem virtuellen, abstrakten oder überschreibenden Modifikator gekennzeichnet ist, während in Programmiersprachen wie JAVA verschiedene Methoden aufgerufen werden können, um andere Methoden zu überschreiben.[11] Eine Alternative zum Überschreiben ist versteckt der ererbte Code.
Code -Wiederverwendung
Implementierungserbranz ist der Mechanismus, bei dem eine Unterklasse Wiederverwendung Code in einer Basisklasse. Standardmäßig behält die Unterklasse alle Operationen der Basisklasse bei, aber die Unterklasse kann jedoch überschreiben Einige oder alle Operationen, die die Basisklasse-Implementierung durch seine eigenen ersetzen.
Im folgenden Python -Beispiel, Unterklassen Quadratecomputer und Würfelcomputer überschreiben die verwandeln() Methode der Basisklasse Sumcomputer. Die Basisklasse umfasst Operationen, um die Summe der Summe zu berechnen Quadrate zwischen zwei Ganzzahlen. Die Unterklasse wird alle Funktionen der Basisklasse mit Ausnahme des Vorgangs wiederverwendet, der eine Zahl in ihr Quadrat umwandelt und sie durch eine Operation ersetzt Quadrat und Würfel beziehungsweise. Die Unterklassen berechnen daher die Summe der Quadrate/Würfel zwischen zwei Ganzzahlen.
Unten ist ein Beispiel für Python.
Klasse Sumcomputer: def __drin__(selbst, a, b): selbst.a = a selbst.b = b def verwandeln(selbst, x): heben NotimplementedError def Eingänge(selbst): Rückkehr Angebot(selbst.a, selbst.b) def berechnen(selbst): Rückkehr Summe(selbst.verwandeln(Wert) zum Wert in selbst.Eingänge()) Klasse Quadratecomputer(Sumcomputer): def verwandeln(selbst, x): Rückkehr x * x Klasse Würfelcomputer(Sumcomputer): def verwandeln(selbst, x): Rückkehr x * x * x
In den meisten Quartalen ist die Klassenvererbung für den einzigen Zweck der Code -Wiederverwendung in Ungnade gefallen. Das Hauptanliegen besteht darin polymorph Substitutabilität - Ein Beispiel der Wiederverwendungsklasse kann nicht unbedingt durch eine Instanz der ererbten Klasse ersetzt werden. Eine alternative Technik, explizit Delegationerfordert mehr Programmieraufwand, vermeidet das Problem mit Substituierbarkeit. In C ++ - privates Erbe kann als Form von verwendet werden Implementierung Vererbung ohne Substituierbarkeit. Während die öffentliche Vererbung eine Beziehung "is-a" darstellt und die Delegation eine "HAS-A" -Beziehung darstellt, kann eine private (und geschützte) Vererbung als "in Bezug auf die" Beziehung umgesetzt werden.[12]
Eine weitere häufige Verwendung der Vererbung besteht darin, zu garantieren, dass Klassen eine bestimmte gemeinsame Schnittstelle beibehalten. Das heißt, sie implementieren die gleichen Methoden. Die übergeordnete Klasse kann eine Kombination aus implementierten Operationen und Operationen sein, die in den untergeordneten Klassen implementiert werden sollen. Oft gibt es keine Schnittstellenänderung zwischen dem Supertyp und dem Subtyp- das Kind implementiert das beschriebene Verhalten anstelle seiner übergeordneten Klasse.[13]
Vererbung gegen Subtyping
Die Vererbung ist ähnlich wie bei Subtyping.[3] Das Subtyping ermöglicht es, dass ein bestimmter Typ durch einen anderen Typ oder eine Abstraktion ersetzt werden und eine festgelegt werden soll ist ein Beziehung zwischen dem Subtyp und einer vorhandenen Abstraktion, entweder implizit oder explizit, abhängig von der Sprachunterstützung. Die Beziehung kann explizit durch Vererbung in Sprachen ausgedrückt werden, die die Vererbung als Subtyping -Mechanismus unterstützen. Zum Beispiel stellt der folgende C ++ - Code eine explizite Erbschaftsbeziehung zwischen Klassen fest B und A, wo B ist sowohl eine Unterklasse als auch ein Subtyp von Aund kann als als verwendet werden A wo immer a B wird angegeben (über eine Referenz, ein Zeiger oder das Objekt selbst).
Klasse A { Öffentlichkeit: Leere Dosen etwas() Const {} }; Klasse B : Öffentlichkeit A { Öffentlichkeit: Leere Doomthethingblatt() Const {} }; Leere Usana(Const A& a) { a.Dosen etwas(); } Leere Ein bisschen() { B b; Usana(b); // b kann durch ein A. ersetzt werden. }
In Programmiersprachen, die die Vererbung nicht unterstützen als Untertypmechanismus, Die Beziehung zwischen einer Basisklasse und einer abgeleiteten Klasse ist nur eine Beziehung zwischen Implementierungen (ein Mechanismus für die Wiederverwendung von Code) im Vergleich zu einer Beziehung zwischen Typen. Die Vererbung bedeutet selbst in Programmiersprachen, die die Vererbung als Subtyping -Mechanismus unterstützen, nicht unbedingt Verhaltensuntertyp. Es ist durchaus möglich, eine Klasse abzuleiten, deren Objekt in einem Kontext, in dem die übergeordnete Klasse erwartet wird, falsch verhalten. Siehe das Liskov -Substitutionsprinzip.[14] (Vergleichen Konnotation/Bezeichnung.) In einigen OOP -Sprachen fällt die Vorstellungen von Code -Wiederverwendung und Subtyping zusammen, da die einzige Möglichkeit, einen Subtyp zu deklarieren, darin besteht, eine neue Klasse zu definieren, die die Implementierung eines anderen erbt.
Designeinschränkungen
Die Verwendung der Vererbung bei der Entwurf eines Programms führt zu bestimmten Einschränkungen.
Betrachten Sie zum Beispiel eine Klasse Person Das enthält den Namen einer Person, das Geburtsdatum, die Adresse und die Telefonnummer. Wir können eine Unterklasse von definieren Person genannt Student Das enthält den Notendurchschnitt der Person und die angenommenen Klassen und eine andere Unterklasse von Person genannt Angestellter Das enthält den Job, den Arbeitgeber und das Gehalt der Person.
Bei der Definition dieser Vererbungshierarchie haben wir bereits bestimmte Einschränkungen definiert, von denen nicht alle wünschenswert sind:
- Single sein
- Mit einer einzigen Vererbung kann eine Unterklasse nur von einer Superklasse erben. Fortsetzung des oben angegebenen Beispiels, Person Kann entweder a sein Student oder an Angestellter, aber nicht beide. Die Verwendung mehrerer Vererbung löst dieses Problem teilweise, da man dann a definieren kann Studentenbeschäftigte Klasse, die von beiden erbt Student und Angestellter. In den meisten Implementierungen kann es jedoch immer noch nur einmal von jeder Superklasse erben und unterstützt daher keine Fälle, in denen ein Student zwei Jobs hat oder zwei Institutionen besucht. Das in Eiffel verfügbare Vererbungsmodell ermöglicht dies durch Unterstützung für wiederholtes Erbe.
- Statisch
- Die Vererbungshierarchie eines Objekts wird auf festgelegt Instanziierung Wenn der Typ des Objekts ausgewählt ist und sich nicht mit der Zeit ändert. Zum Beispiel erlaubt das Vererbungsdiagramm keine a Student Objekt zu werden a Angestellter Objekt, während der Zustand dessen beibehält Person Superklasse. (Diese Art von Verhalten kann jedoch mit dem erreicht werden Dekorateurmuster.) Einige haben die Vererbung kritisiert und behauptet, dass sie Entwickler in ihre ursprünglichen Designstandards einsperrt.[15]
- Sichtweite
- Wenn der Clientcode zu Zugriff auf ein Objekt verfügt, hat er im Allgemeinen Zugriff auf alle Supercass -Daten des Objekts. Auch wenn die Superklasse nicht öffentlich erklärt wurde, kann der Kunde immer noch gießen das Objekt zu seinem Superklassentyp. Zum Beispiel gibt es keine Möglichkeit, einer Funktion einen Zeiger auf a zu geben Student's Notfalldurchschnitt und Transkript, ohne diese Funktion zugänglich zu machen, zu allen im Schüler gespeicherten personenbezogenen Daten Person Superklasse. Viele moderne Sprachen, einschließlich C ++ und Java, bieten einen "geschützten" Zugriffsmodifikator, mit dem Unterklassen auf die Daten zugreifen können, ohne dass ein Code außerhalb der Erbscheibe auf sie zugänglich ist.
Das zusammengesetzter Wiederverwendungsprinzip ist eine Alternative zur Vererbung. Diese Technik unterstützt Polymorphismus und Wiederverwendung von Code, indem es Verhaltensweisen von der primären Klassenhierarchie trennt und bestimmte Verhaltensklassen wie in jeder Geschäftsdomänenklasse erfordert. Dieser Ansatz vermeidet die statische Natur einer Klassenhierarchie, indem es Verhaltensänderungen zur Laufzeit ermöglicht, und ermöglicht es einer Klasse, Verhaltensweisen im Buffetstil zu implementieren, anstatt sich auf die Verhaltensweisen seiner Vorfahren zu beschränken.
Probleme und Alternativen
Die Implementierungsvererbung ist seit mindestens den neunziger Jahren bei Programmierern und Theoretikern objektorientierter Programmierer umstritten. Unter ihnen sind die Autoren von Designmuster, der stattdessen die Vererbung der Schnittstelle befürwortet und die Zusammensetzung gegenüber der Vererbung bevorzugt. Zum Beispiel das Dekorationsmuster (wie erwähnt Oben) wurde vorgeschlagen, um die statische Natur der Vererbung zwischen Klassen zu überwinden. Als grundlegendere Lösung für dasselbe Problem, rollenorientierte Programmierung führt eine eigene Beziehung ein, gespielt vonKombination von Eigenschaften von Vererbung und Komposition zu einem neuen Konzept.
Entsprechend Allen HolubDas Hauptproblem bei der Implementierungsvererbung besteht darin, dass es unnötig einführt Kupplung in Form der "fragiles Problem der Basisklasse":[5] Änderungen an der Implementierung der Basisklassen können unbeabsichtigte Verhaltensänderungen in Unterklassen verursachen. Die Verwendung von Schnittstellen vermeidet dieses Problem, da keine Implementierung geteilt wird, nur die API.[15] Eine andere Möglichkeit, dies zu sagen, ist, dass "die Vererbung bricht Verkapselung".[16] Das Problem taucht deutlich in offenen objektorientierten Systemen auf, wie z. Frameworks, wobei der Clientcode erwartet wird, dass er aus systembedingten Klassen erben und dann die Klassen des Systems in seinen Algorithmen ersetzt.[5]
Berichten zufolge Java Inventor James Gosling hat gegen die Implementierung erbliche gesprochen und erklärt, dass er es nicht einbeziehen würde, wenn er Java neu gestalten würde.[15] Sprachdesigns, die die Vererbung aus der Subtyping (Schnittstellenvererbung) entkoppeln, erschienen bereits 1990;[17] Ein modernes Beispiel dafür ist das gehen Programmiersprache.
Komplexer Vererbung oder Vererbung, die innerhalb eines unzureichend reifen Designs verwendet wird, kann zu dem führen Jo-Jo-Problem. Als die Vererbung in den späten neunziger Jahren als primärer Ansatz für den Strukturcode in einem System verwendet wurde, begannen Entwickler, Code auf natürliche Weise in mehrere Schichten der Vererbung zu unterteilen, als die Systemfunktionalität zunahm. Wenn ein Entwicklungsteam mehrere Vererbungsschichten mit dem Prinzip der einzelnen Verantwortung kombinierte, erstellte es viele superdünne Codeschichten, viele, die nur 1 oder 2 Codezeilen in jeder Ebene haben. Zu viele Schichten machen das Debuggen zu einer bedeutenden Herausforderung, da es schwierig wird, zu bestimmen, welche Schicht debuggiert werden muss.
Ein weiteres Problem mit der Vererbung ist, dass Unterklassen in Code definiert werden müssen, was bedeutet, dass Programmnutzer zur Laufzeit keine neuen Unterklassen hinzufügen können. Andere Designmuster (wie z. Entity -Component -System) Erlauben Sie den Programmnutzern, die Variationen eines Unternehmens zur Laufzeit zu definieren.
Siehe auch
- Archetypmuster
- Circle -Elipse -Problem
- Überlegungsfähige Argumentation- Argumentation, das rational überzeugend ist, aber nicht abgezogen gültig ist
- Schnittstelle (Computing)- Konzept der Informatik; Interaktionspunkt zwischen zwei Dingen
- Methodenüberschreibung-Sprachfunktion in objektorientierter Programmierung
- Mischen
- Polymorphismus (Informatik)- Programmiersprache Konzept
- Protokoll
- Rollenorientierte Programmierung- Programmierparadigma basierend auf dem konzeptionellen Verständnis von Objekten
- Das dritte Manifest
- Merkmal (Computerprogrammierung)-Konzept, das in objektorientierter Programmierung verwendet wird
- Virtuelle Vererbung
Anmerkungen
Verweise
- ^ Johnson, Ralph (26. August 1991). "Entwerfen wiederverwendbarer Klassen" (PDF). www.cse.msu.edu.
- ^ Mintz, Mike; Ekendahl, Robert (2006). Hardwareverifizierung mit C ++: Das Handbuch eines Praktizierenden. Springer. p. 22. ISBN 978-0-387-25543-9.
- ^ a b Cook, William R.; Hill, Walter; Canning, Peter S. (1990). Vererbung ist nicht subtypisch. Verfahren des 17. ACM Sigplan-Sigact-Symposiums über Prinzipien der Programmiersprachen (POPL). S. 125–135. Citeseerx 10.1.1.102.8635. doi:10.1145/96709.96721. ISBN 0-89791-343-4.
- ^ Cardelli, Luca (1993). Typful -Programmierung (Technischer Bericht). Digital Equipment Corporation. p. 32–33. SRC -Forschungsbericht 45.
- ^ a b c Mikhajlov, Leonid; Sekerinski, Emil (1998). Eine Untersuchung des fragilen Basisklassenproblems (PDF). Verfahren der 12. Europäischen Konferenz über objektorientierte Programmierung (ECOOP). Vorlesungsnotizen in Informatik. Vol. 1445. Springer. S. 355–382. doi:10.1007/bfb0054099. ISBN 978-3-540-64737-9.
- ^ Tempero, Ewan; Yang, Hong Yul; Noble, James (2013). Was Programmierer machen mit Erbschaft in Java (PDF). ECOOP 2013-Objekt-orientiertes Programmieren. Vorlesungsnotizen in Informatik. Vol. 7920. Springer. S. 577–601. doi:10.1007/978-3-642-39038-8_24. ISBN 978-3-642-39038-8.
- ^ "C ++ Vererbung". www.cs.nmsu.edu.
- ^ Stroustrup, Bjarne (1994). Das Design und die Entwicklung von C ++. Pearson. p. 417. ISBN 9780135229477.
- ^ Schildt, Herbert (2003). Die vollständige Referenz C ++. Tata McGrawhill. p.417. ISBN 978-0-07-053246-5.
- ^ Balagurusamy, E. (2010). Objektorientierte Programmierung mit C ++. Tata McGrawhill. p. 213. ISBN 978-0-07-066907-9.
- ^ überschreiben (c# Referenz)
- ^ "GOTW #60: Ausnahmesicherer Klassen Design, Teil 2: Vererbung". Gotw.ca. Abgerufen 2012-08-15.
- ^ Venugopal, K. R.; Buyya, Rajkumar (2013). Mastering C ++. Tata McGrawhill Education Private Limited. p. 609. ISBN 9781259029943.
- ^ Mitchell, John (2002). "10" Konzepte in objektorientierten Sprachen "". Konzepte in der Programmiersprache. Cambridge University Press. p.287. ISBN 978-0-521-78098-8.
- ^ a b c Holub, Allen (1. August 2003). "Warum sich ausdehnt ist böse". Abgerufen 10. März 2015.
- ^ Seiter, Linda M.; Palsberg, Jens; Lieberherr, Karl J. (1996). "Evolution des Objektverhaltens unter Verwendung von Kontextbeziehungen". ACM Sigsoft Software Engineering Notizen. 21 (6): 46. Citeseerx 10.1.1.36.5053. doi:10.1145/250707.239108.
- ^ Amerika, Pierre (1991). Entwerfen einer objektorientierten Programmiersprache mit Verhaltensuntertypen. Rex School/Workshop über die Grundlagen objektorientierter Sprachen. Vorlesungsnotizen in Informatik. Vol. 489. S. 60–90. doi:10.1007/bfb0019440. ISBN 978-3-540-53931-5.
Weitere Lektüre
- Meyer, Bertrand (1997). "24. Verwenden Sie die Vererbung gut". Objektorientierte Softwarekonstruktion (2. Aufl.). Prentice Hall. ISBN 0-13-629155-4.
- Samokhin, Vadim (2017). "Implementierungserbranz ist böse". Hackernoon. Mittel.