5.16. Pieczętowanie klas
Innym modyfikatorem, którym można poprzedzić definicję klasy, jest sealed. Ten modyfikator powoduje „opieczętowanie” klasy. Taka klasa może być rozszerzana tylko w jednostce kompilacji (czyli zwykle w pliku źródłowym), w której została zdefiniowana. W plikach SealedColor.scala i SealedFigure.scala są zdefiniowane dwie opieczętowane klasy, w tym jedna abstrakcyjna — Color i Figure — reprezentujące kolory i figury szachowe.
Specyfikacja języka Scala opisuje modyfikator sealed w punkcie 5.2.7. |
Plik SealedColor.scala: sealed class Color class White extends Color class Black extends Color
Plik SealedFigure.scala: abstract sealed class Figure(color: Color) class Pawn(color: Color) extends Figure(color) class King(color: Color) extends Figure(color) class Queen(color: Color) extends Figure(color) class Rook(color: Color) extends Figure(color) class Bishop(color: Color) extends Figure(color) class Knight(color: Color) extends Figure(color)
Po skompilowaniu pliku, próba utworzenia nowych klas dziedziczących z klas Color i Figure nie udaje się.
scala> class Green extends Color <console>:10: error: illegal inheritance from sealed class Color class Green extends Color ^ scala> class Prince(color: Color) extends Figure(color) <console>:10: error: illegal inheritance from sealed class Figure class Prince(color: Color) extends Figure(color) ^
Natomiast jest możliwe dziedziczenie z klas będących podklasami klas Color i Figure. Te podklasy nie mają modyfikatora sealed (ani final).
scala> class Green extends White defined class Green scala> class Prince(color: Color) extends King(color) defined class Prince