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 auch sealed
oder sind final
, 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:
data List a = Nil | Cons a (List a)
kann in Scala folgendermaßen modelliert werden:
sealed trait List[+A]
case object Nil extends List[Nothing]
final case class Cons[+A] extends List[A]
Und Sie können garantieren , dass nur diejenigen zwei Unter „Klassen“ existieren , weil List
ist sealed
und somit nicht längere außerhalb der Datei sein kann, Cons
ist final
und somit überhaupt nicht erweitert werden und Nil
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 tut Nil
und Cons
es wird nicht sein , andere Alternative hinter seinem Rücken auftauchen.