Каков вариант использования незапечатанных дочерних элементов запечатанных классов и интерфейсов?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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