Sollte eine Klasse etwas über ihre Unterklassen wissen? Sollte eine Klasse beispielsweise etwas tun, das für eine bestimmte Unterklasse spezifisch ist?
Mein Instinkt sagt mir, dass dies ein schlechtes Design ist, es scheint eine Art Anti-Muster zu sein.
Antworten:
Die Antwort des Klassenbegriffs lautet "nein".
Unabhängig davon, welche Aktion, Daten oder Relationen Sie verarbeiten, sind sie Teil aller Unterklassen. Sie sollten sie in der Oberklasse verarbeiten, ohne den tatsächlichen Typ zu überprüfen. Oder es gilt nur für einige Unterklassen - dann müssten Sie Laufzeit-Typprüfungen durchführen, um das Richtige zu tun, die Superklasse müsste geändert werden, wenn jemand anderes davon erbt (oder es könnte stillschweigend das Falsche tun). Änderungen in den abgeleiteten Klassen können die unveränderte Oberklasse auflösen usw.
Kurz gesagt, es gibt eine Reihe von schlimmen Konsequenzen, die normalerweise so schlimm sind, dass solche Lösungen sofort abgelehnt werden. Wenn mehrere Ihrer Unterklassen dasselbe tun und Sie eine Codeduplizierung vermeiden möchten (praktisch immer eine gute Sache), ist es eine bessere Lösung, eine Mittelklasse einzuführen, von der alle diese Unterklassen den Code erben können.
quelle
Nicht nur sollte es nicht wissen, es kann einfach nicht ! Normalerweise kann eine Klasse jederzeit und überall erweitert werden. Es kann um Klassen erweitert werden, die zum Zeitpunkt der Erstellung noch nicht vorhanden waren.
In einigen Sprachen können erweiterte Klassen von der Oberklasse gesteuert werden. In Scala kann eine Klasse als markiert werden
sealed
, was bedeutet, dass sie nur durch andere Klassen innerhalb derselben Kompilierungseinheit (Quelldatei) erweitert werden kann. Sofern diese Unterklassen nicht auchsealed
oder sindfinal
, können die Unterklassen dann durch andere Klassen erweitert werden.In Scala wird dies verwendet, um geschlossene algebraische Datentypen zu modellieren, also den kanonischen Haskell-
List
Typ:kann in Scala folgendermaßen modelliert werden:
Und Sie können garantieren , dass nur diejenigen zwei Unter „Klassen“ existieren , weil
List
istsealed
und somit nicht längere außerhalb der Datei sein kann,Cons
istfinal
und somit überhaupt nicht erweitert werden undNil
ist eine ,object
die nicht ohnehin verlängert werden kann.Dies ist jedoch ein spezieller Anwendungsfall (Modellierung algebraischer Datentypen über Vererbung), und selbst in diesem Fall weiß die Oberklasse nichts über ihre Unterklassen. Es ist mehr eine Garantie für den Benutzer der
List
Art , dass , wenn er einen Fall von Diskriminierung der tutNil
undCons
es wird nicht sein , andere Alternative hinter seinem Rücken auftauchen.quelle
abstract internal
Mitglied.Die einfache Antwort lautet Nein.
Es macht Code spröde und sperrt zwei Grundprinzipien der objektorientierten Programmierung.
quelle
Ja manchmal. Zum Beispiel, wenn es eine begrenzte Anzahl von Unterklassen gibt. Ein Besuchermuster ist ein Beispiel für die Nützlichkeit dieses Ansatzes.
Beispiel: Ein AST-Knoten (Abstract Syntax Tree) mit einer genau definierten Grammatik kann von einer einzelnen
Node
Klasse geerbt werden, die ein Besuchermuster implementiert, um alle Knotentypen zu verarbeiten.quelle
Node
natürlich keine direkten Verweise auf ihre Unterklassen. Es enthält jedoch eineaccept
Methode mit einemVisitor
Parameter. UndVisitor
enthält einevisit
Methode pro Unterklasse. ObwohlNode
es keine direkten Verweise auf seine Unterklassen gibt, "weiß" es über dieVisitor
Schnittstelle indirekt über sie Bescheid . Sie alle verbanden sich dadurch.Wenn ich eine Komponente für eine Firma schreibe und später, nachdem ich gegangen bin, jemand sie für eigene Zwecke erweitert, sollte ich darüber informiert werden?
Nein!
Gleiches gilt für den Unterricht. Vertraue deinen Instinkten.
quelle