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 List
type 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 List
est sealed
et ne peut donc pas être étendue en dehors du fichier, Cons
est final
et ne peut donc pas être étendue à tous et Nil
est un object
qui 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 List
type que s'il fait une discrimination de cas Nil
et Cons
, il n'y aura pas d' autre alternative surgissant derrière son dos.