Когда вы переопределяете метод, вы должны сохранить подпись метода и не можете уменьшить его видимость. Теперь я пробовал, что происходит, когда я делаю это с помощью атрибутов. Я был удивлен - ЭТО РАБОТАЕТ! Посмотрите сами:
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);
}
}
Таким образом, можно написать атрибут в подклассе с тем же именем attibute, что и в суперклассе, но вы можете использовать различную видимость (модификатор) и тип. Поэтому я бы сказал, что атрибуты в суперклассе и подклассе почти полностью независимы друг от друга.
Теперь, если вы действительно используете одно и то же имя атрибута в суперклассе и подклассе, вы фактически скрываете атрибут суперкласса. При доступе к атрибуту с использованием подкласса вы получаете атрибут подкласса. Но атрибут суперкласса тоже есть! Вы должны выполнить бросок, чтобы получить доступ к атрибуту суперкласса снаружи. Изнутри ключевое слово "супер" должно быть полезно.
Вопрос 1: Теперь в основном у вас есть два разных атрибута с тем же именем. Разве это не перерыв LSP?
Почему я пришел к этой детали: Я экспериментирую с собственной письменной основой сохранения. Я хочу прочитать полное внутреннее состояние объекта и сохранить это состояние. Я читал все значения атрибутов через рефлексию, начиная с подтипа и пересекая суперклассы. Теперь, если в суперклассе и подклассе есть два атрибута с тем же именем, я должен помнить класс, который объявляет атрибут, чтобы он мог сопоставлять значения атрибутов с правильными атрибутами и восстанавливать состояние объекта.
Вопрос 2: Любые другие идеи, как справиться с этой деталью? Вопрос 3: Как другие структуры персистентности справляются с этой деталью?
Я никогда не видел эту деталь в использовании. Возможно, написание двух атрибутов с одним и тем же именем является немного уродливым, но это возможно, и с ним может столкнуться любая инфраструктура persistence. Возможно, есть ситуации, когда этот метод может быть полезен.
Заблаговременно.