Каков вариант использования незапечатанных дочерних элементов запечатанных классов и интерфейсов?JAVA

Программисты JAVA общаются здесь
Anonymous
Каков вариант использования незапечатанных дочерних элементов запечатанных классов и интерфейсов?

Сообщение Anonymous »

Я только что узнал о запечатанных классах в Java, и мне кажется, неплохо иметь что-то среднее между финальными и обычными нефинальными классами.
Но модификаторы «запечатанные» и разрешений влияют только на непосредственных дочерних классов класса; мне это кажется не совсем правильным. В частности, вы можете получить произвольные подклассы запечатанного класса, используя незапечатанный класс "shim"/backdoor:

Код: Выделить всё

public sealed class Shape permits Ellipse, Polygon { /* ... */ }

public non-sealed class Ellipse extends Shape { /* ... */ }

public class RealEllipse1 extends Ellipse { /* ... */ }
public class RealEllipse2 extends Ellipse { /* ... */ }
public class RealEllipse3 extends Ellipse { /* ... */ }
// and so on
А поскольку отношение is-a является транзитивным, любой экземпляр этих классов RealEllipseN является объектом Shape.
Похоже, это противоречит намерению пометить класс как запечатанный. Если разрешенные подклассы могут быть произвольными подклассами, у вас фактически будут произвольные подклассы (если не прямые подклассы) запечатанного класса, а соответствующие операторы и проверка типов являются транзитивными, то есть такие вещи работают, верно?

Код: Выделить всё

Shape aShape = new RealEllipse2();
RealEllipse1 anotherShape = new RealEllipse1();

if (anotherShape instanceof Shape) {
// this executes; instanceof says anotherShape is an instance of Shape
}
Приведенная выше семантика, связанная с наследованием, кажется, противоречит существованию подклассов запечатанного класса, которые не являются окончательными. Какова мотивация или вариант использования незапечатанного и тому подобного?
(Это связано с этим вопросом.)

Подробнее здесь: https://stackoverflow.com/questions/797 ... interfaces

Вернуться в «JAVA»