Ошибка в методах 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 ответа

  1. Не определяйте ваши установщики имен и получатели как абстрактные, если вы не хотите менять модификатор доступа "String Name" на public или protected. Сделай это:
public String getName () {возвращаемое имя;} 
public void setName(String name){Имя = имя;}
  1. В вашем детском классе; Сделай это:
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 это правильный путь.

Другие вопросы по тегам