Clases Sealed

Las clases Sealed están relacionadas con herencia de clases. Estas clases o interfaces selladas nos permiten restringir que otras clases e interfaces puede extender de ellas. El objetivo de las clases o interfaces sealed es proporcionar una forma de permitir que una clases sea ampliamente accessible pero a la vez no ampliamente extensible. Estas pueden ser extendidas o implementadas solamente por aquellas clases e interfaces que son explícitamente permitidas. Las clases sealed no tiene como objetivo ser un reemplazo a la palabra reservada final. Palabra reservada: sealed, non-sealed y permits

Ejemplo:

public abstract sealed class Shape
    permits Circle, Rectangle, Square, WeirdShape { ... }

public final class Circle extends Shape { ... }
public final class Rectangule extends Shape { ... }
public final class Square extends Shape { ... }
public final class WeirdShape extends Shape { ... }

Como podéis observar esta posibilidad nos permite controlar más la propagación de la herencia. Cada subclase que herede debe usar un modificador para describir como propagar el sellado iniciado por su super-clase:

  • Una sub-clase permitida puede aplicar el modificar final para evitar extenderse más.
  • Una sub-clase permitida puede aplicar el modificador sealed seguido de la cláusula permits para extender a otras sub-clases en su jerarquía.
  • Una sub-clase permitida puede aplicar el modificador non-sealed de manera que revierte en su propia jerarquía el “sellado” de la clase super clase, y abriendo la extensión a otros clases desconocidas por la super clase. Ejemplos:
public abstract sealed class Shape
    permits Circle, Rectangle, Square, WeirdShape { ... }

public final class Circle extends Shape { ... }

public sealed class Rectangle extends Shape 
    permits TransparentRectangle, FilledRectangle { ... }
public final class TransparentRectangle extends Rectangle { ... }
public final class FilledRectangle extends Rectangle { ... }

public final class Square extends Shape { ... }

public non-sealed class WeirdShape extends Shape { ... }

El modificador sealed también se pueden usar tanto para interfaces como para records.

Ejercicio 1

Haz un pequeño ejemplo donde pruebes sealed para interfaces como para records.