Non seulement il ne devrait pas savoir, mais il ne peut tout simplement pas ! Habituellement, une classe peut être étendue à tout moment et en tout lieu. Il peut être étendu par des classes qui n'existaient même pas lors de son écriture.
Certaines langues permettent aux classes d'extension d'être contrôlées par la superclasse. Dans Scala, une classe peut être marquée comme sealed, ce qui signifie qu'elle ne peut être étendue que par d'autres classes au sein de la même unité de compilation (fichier source). Cependant, à moins que ces sous-classes ne soient également sealed ou final, les sous-classes peuvent ensuite être étendues par d'autres classes.
Dans Scala, ceci est utilisé pour modéliser des types de données algébriques fermés, donc le Listtype canonique de Haskell :
data List a = Nil | Cons a (List a)
peut être modélisé dans Scala comme ceci:
sealed trait List[+A]
case object Nil extends List[Nothing]
final case class Cons[+A] extends List[A]
Et vous pouvez garantir que seulement ces deux exist « classes » sous - car Listest sealedet ne peut donc pas être étendue en dehors du fichier, Consest finalet ne peut donc pas être étendue à tous et Nilest un objectqui ne peut être prolongé de toute façon.
Mais il s'agit d'un cas d'utilisation spécifique (modélisation de types de données algébriques via l'héritage) et même dans ce cas, la superclasse ne connaît pas réellement ses sous-classes. C'est plus une garantie pour l' utilisateur du Listtype que s'il fait une discrimination de cas Nilet Cons, il n'y aura pas d' autre alternative surgissant derrière son dos.