Когда вы переопределяете метод, вы должны сохранить сигнатуру метода и не можете уменьшить его видимость. Теперь я попробовал, что происходит, когда я делаю это с атрибутами. Я был удивлен - это работает! Смотри сам:
public class A {
public Integer myAttribute;
}
public class B extends A {
public String myAttribute;
}
public class Main {
public static void main(String[] args) {
B b = new B();
b.myAttribute = "myString";
((A) b).myAttribute = 1337;
System.out.println(b.myAttribute);
System.out.println(((A)b).myAttribute);
}
}
Таким образом, можно написать атрибут в подклассе с тем же именем атрибута, что и в суперклассе, но вы можете использовать разные видимость (модификатор) и тип. Поэтому я бы сказал, что атрибуты в суперклассе и подклассе практически полностью независимы друг от друга.
Теперь, если вы действительно используете одно и то же имя атрибута в суперклассе и подклассе, вы фактически скрываете атрибут суперкласса. При доступе к атрибуту с использованием подкласса вы получаете атрибут подкласса. Но атрибут суперкласса тоже есть! Вы должны выполнить приведение, чтобы получить доступ к атрибуту суперкласса извне. Изнутри ключевое слово «super» должно быть полезным.
Вопрос 1:
Теперь у вас есть два разных атрибута с одинаковыми именами. Разве это не ломается LSP ?
Почему я пришел к этой детали так:
Я экспериментирую с самописной основой персистентности. Я хочу прочитать полное внутреннее состояние объекта и сохранить это состояние. Я читаю все значения атрибута с помощью рефлексии, начиная с подтипа и проходя через суперклассы.
Теперь, если в суперклассе и подклассе есть два атрибута с одинаковыми именами, я должен запомнить класс, который объявляет атрибут, чтобы иметь возможность сопоставлять значения атрибутов с правильными атрибутами и восстанавливать состояние объекта.
Вопрос 2:
Любые другие идеи, как бороться с этой деталью?
Вопрос 3:
Как другие персистентные фреймворки обрабатывают эту деталь?
Я никогда не видел эту деталь в использовании. Может быть, написание двух атрибутов с одним и тем же именем немного уродливо, но это возможно, и любой персистентный фреймворк может столкнуться с этим. Возможно, есть ситуации, когда этот метод может быть полезен.
Заранее.