Ошибка в методах set и get
Я студент 1-го курса IT, берущий ООП...
у меня есть этот абстрактный родительский класс...
public abstract class Person{
private String Name;
protected Person(){
setName("xxxxxxxx");
}
public abstract String getName();
public abstract void setName(String name);
}
и это его дочерний класс...
public class PetOwner extends Person{
private boolean hasKids;
private boolean hasAllergies;
public PetOwner(){
setName("xxxx");
setAllergies(true);
setKids(true);
}
public PetOwner(String name, boolean a, boolean k){
setName(name);
setKids(k);
setAllergies(a);
}
public String getName(){return Name;}
public void setName(String n){ Name = n;}
public boolean getAllergies(){return hasAllergies;}
public void setAllergies(boolean a){hasAllergies = a;}
public boolean getKids(){return hasKids;}
public boolean setKids(boolean k){hasKids = k;}
}
Когда я компилирую дочерний класс, он имеет ошибки, что "Имя" является частной переменной Person.
мой вопрос, как я могу получить доступ к закрытым переменным родительского класса в моем дочернем классе, не меняя его на общедоступный или защищенный??
2 ответа
- Не определяйте ваши установщики имен и получатели как абстрактные, если вы не хотите менять модификатор доступа "String Name" на public или protected. Сделай это:
public String getName () {возвращаемое имя;} public void setName(String name){Имя = имя;}
- В вашем детском классе; Сделай это:
public String getName () {return super.getName ();} public void setName (String n) {super.setName (n);}
С другой стороны: вы не присваиваете значение Name в конструкторе вашего суперкласса. Вместо этого напишите Name = xxxx, потому что вы вызываете абстрактный метод!
private
члены являются частными по отношению к сущности, в которой они определены. protected
являются частными для сущности, которую они определяют, и для их подклассов. public
означает отсутствие защиты / доступно везде.
Грубо говоря, если вы определяете атрибут в данном объекте, тогда почти все управление им должно быть определено в одном месте. Это означает, что если Person
имеет name
тогда метод setName
а также getName
должны быть определены в Person
, Они могут быть переопределены в подклассах, но, по крайней мере, они должны быть определены в Person
,
Подумайте об этом: почему вы хотите (в общих случаях) каждый PetOwner
или же ClergyMan
определить setName
? Они, вероятно, будут делать то же самое; так с учетом определения в Person
это правильный путь.