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

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.