Wenn Sie versuchen, das Konzept der Vererbung in OOP zu erklären, ist das häufigste Beispiel das Beispiel von Säugetieren. IMHO, das ist wirklich ein schlechtes Beispiel, weil es die Neulinge dazu bringt, dieses Konzept falsch zu verwenden. Darüber hinaus ist es kein gewöhnliches Design, mit dem sie in ihrer täglichen Designarbeit konfrontiert werden.
Also, was wird ein schönes, einfaches und konkretes Problem sein, das mit Inheritance gelöst wird?
design-patterns
object-oriented
inheritance
Pierre Watelet
quelle
quelle
Antworten:
An einem rein akademischen Beispiel wie Säugetieren ist nichts auszusetzen. Ich mag auch das Rechteck / Quadrat-Beispiel, weil es darauf hinweist, warum Taxonomien aus der realen Welt nicht immer direkt in die zu erwartende Vererbungsbeziehung übersetzt werden.
Meiner Meinung nach ist das kanonischste Beispiel für jeden Tag ein GUI-Toolkit. Es ist etwas, das jeder benutzt hat, aber Anfänger haben vielleicht nicht begründet, wie sie unter der Haube arbeiten. Sie können darüber sprechen, welche Verhaltensweisen allen Containern, Widgets, Ereignissen usw. gemeinsam sind, ohne detaillierte Kenntnisse über eine bestimmte Implementierung zu benötigen.
quelle
Mein reales Beispiel ist das Domänenmodell einer einfachen HR-Anwendung. Ich sage, dass wir eine Basisklasse namens Employee erstellen können , weil Manager natürlich auch Mitarbeiter sind.
Dann erkläre ich , dass Entwickler sind Mitarbeiter , Tester sind Mitarbeiter , Projektmanager sind Mitarbeiter . Somit können sie alle von der Mitarbeiterklasse erben .
quelle
Employee
könnte es sich auch um eineabstract
Klasse handeln.Developer
als auch a sein mussTester
. Eine andere ähnliche Situation ist eine Kontaktdatenbank, in der Sie habenCustomer
undSupplier
, aber wie jeder, der ein solches System erstellt hat, Ihnen sagen wird, gibt es immer einen Fall, in dem aCompany
beides ist. Deshalb führen Sie die meisten dieser Beispiele in die falsche Richtung.Verkapseln, was variiert ... Zeigen Sie ihnen ein Muster für eine Vorlagenmethode . Es demonstriert die Nützlichkeit der Vererbung, indem gemeinsames Verhalten in eine Basisklasse eingefügt und unterschiedliches Verhalten in Unterklassen eingekapselt wird.
UI controls
undStreams
sind auch ein sehr gutes Beispiel für die Nützlichkeit der Vererbung.quelle
Merken
Jede Instanz eines Objekts ist ein konkretes Beispiel für die Nützlichkeit der Vererbung!
Wenn Sie spezifisch Klassenvererbung meinen , befinden Sie sich jetzt in der Welt der Taxonomien, und diese variieren drastisch je nach den Zielen des Systems, das sie verwendet. Das Beispiel Tiere / Säugetiere verwendet eine verbreitete und hoffentlich vertraute Taxonomie aus der Biologie, die jedoch (wie Sie bereits erwähnt haben) für die überwiegende Mehrheit der Programmierprobleme nahezu unbrauchbar ist.
Probieren Sie etwas Universelles aus: den Begriff eines Programms. Jedes Programm startet, läuft und endet. Jedes Programm hat einen Namen und optionale Befehlszeilenparameter. Daher wäre eine Basis-Programmklasse sehr nützlich, um die Ausführung zu starten, die Befehlszeilenargumente zu erfassen und zu verarbeiten, die Hauptlogik auszuführen und ordnungsgemäß herunterzufahren.
Aus diesem Grund bieten so viele objektorientierte Programmiersprachen eine Programmklasse oder etwas, das sich genau wie eine Programmklasse verhält.
quelle
class Programm { public static void main(String[] args) { system.out.println('hello world'); }}
ist ein minimales Java-Programm. Wenn ich es nenne, gibt es keine Instanz von Program. Programm erbt von nichts. Wenn ich 3 Prozesse starte (wie Sie es mit crhome tun), kann es 3 Programme geben, aber in ihren einzelnen Speicherbereichen gibt es immer noch nur ein Programm. Imho, Singleton impliziert "Nur eine Instanz pro Prozess", nicht pro Maschine. In diesem Fall ist es unmöglich, Singletons zu erstellen. Nichts hindert Sie daran, Code zweimal auszuführen.Ich arbeite mit Kameras bei der Arbeit. Wir haben Geräte, die mit verschiedenen Modellen verbunden sind, daher haben wir eine abstrakte "Kameraklasse" und jedes Modell erbt von dieser Klasse, um bestimmte Funktionen dieser Kamera zu unterstützen. Es ist ein Beispiel aus der Praxis und nicht schwer zu verstehen.
quelle
Camera
und einPhone
(wie wir alle in unseren Taschen jetzt). Von welcher Basisklasse soll sie erben? Oder sollte es nicht einfach dieICamera
undIPhone
-Schnittstellen implementieren? (ha ha)Beispiel für chemische Elemente
Dies ist ein weiteres Beispiel aus meinem Gehirn:
quelle
isotope
ist kein Sonderfall vonElemenet
. Ich hätte lieber eineElement
Immobilie aufIsotope
.Beispiele aus der realen Welt verstehen es fast immer falsch, weil sie Beispiele geben, bei denen es immer die Möglichkeit gibt, dass etwas beides ist,
TypeA
undTypeB
die Hierarchie mit nur einer Vererbung vieler Sprachen dies nicht zulässt.Je mehr ich programmiere, desto weiter entferne ich mich von der Vererbung.
Sogar das Wort "erben" wird hier falsch verwendet. Zum Beispiel erben Sie ungefähr 50% der Merkmale Ihres Vaters und 50% der Merkmale Ihrer Mutter. In Wirklichkeit besteht Ihre DNA aus der Hälfte der DNA Ihres Vaters und der Hälfte der DNA Ihrer Mutter. Das liegt daran, dass die Biologie die Komposition der Vererbung vorgezogen hat , und das sollten Sie auch.
Das einfache Implementieren von Schnittstellen oder noch besser das "Duck Typing" plus Abhängigkeitsinjektion ist eine viel bessere Sache, um Menschen beizubringen, die mit objektorientierter Programmierung noch nicht vertraut sind.
quelle
Ich würde ihnen nur ein reales Beispiel zeigen. Beispielsweise leiten Sie in den meisten UI-Frameworks eine Art "Dialog" - oder "Window" - oder "Control" -Klasse ab, um Ihre eigene zu erstellen.
quelle
Ein gutes Beispiel ist die Vergleichsfunktion beim Sortieren:
Das einzige Problem ist, dass die Neulinge zu oft denken, Leistung sei wichtiger als guter Code ...
quelle
Mein reales Beispiel ist ein Fahrzeug:
Dieses Beispiel kann so detailliert sein, wie Sie möchten, und es gibt alle Arten von Eigenschaften, die mit Fahrzeugen verknüpft sind, um die Verwendung von Modifikatoren zu erläutern, die Sie möglicherweise unterrichten möchten.
quelle
Dieses Nicht-Säugetier-Nicht-Vogel-Nicht-Fisch-Beispiel könnte helfen:
Dann
HINWEIS: Verrate das Geheimnis nur nicht: Person erweitert Säugetier.
quelle
Wie wäre es mit einer Hierarchie algebraischer Ausdrücke? Ist gut, weil es sowohl Vererbung als auch Zusammensetzung umfasst:
Mit Ausnahme der Stammausdruckskonstante sind alle anderen Ausdrücke ein Ausdruck und enthalten einen oder mehrere Ausdrücke.
quelle
Ich werde Vögel als Beispiel verwenden
wie Huhn, Ente, Adler
Ich werde erklären, dass beide Klauen, Klauen und Flügel haben, aber ihre Attribute sind unterschiedlich.
Hühner können nicht fliegen, nicht schwimmen, können Würmer essen, können Getreide essen
Enten können nicht fliegen, schwimmen, Getreide essen, keine Würmer essen
Adler kann fliegen, nicht schwimmen, Würmer fressen, keine Körner fressen
quelle
Ihr typischer Rails-Clone bietet viele praktische Beispiele : Sie haben die (abstrakte) Basismodellklasse, die alle Datenmanipulationen kapselt, und Sie haben die Basiscontrollerklasse, die die gesamte HTTP-Kommunikation kapselt.
quelle