Как использовать абстрактные методы для установки закрытого поля данных?

У меня есть абстрактный класс с именем myClass, и этот класс имеет приватное поле данных с именем x. У меня есть общедоступный метод getX и абстрактный метод setX.

У меня есть подкласс mySubclass, который расширяет myClass. Я пытаюсь создать конкретный метод setX, но код:

public void setX() {
  x = 24.99;
}

выдает ошибку, так как x является частным. Я должен установить поле данных x как защищенное или общедоступное, или есть способ сохранить x закрытым?


person Space Ostrich    schedule 30.05.2016    source источник
comment
Видя, что вы действительно знаете о существовании ключевого слова protected, я предлагаю вам подумать над этим вопросом: Почему вы хотите, чтобы это поле было закрытым, а не защищенным?   -  person RaminS    schedule 30.05.2016
comment
Мне сказали, и я понимаю, почему приватность предпочтительнее, когда это возможно, я не был уверен, возможен ли приват в этом сценарии.   -  person Space Ostrich    schedule 30.05.2016
comment
Если вы действительно хотите, чтобы он был закрытым в суперклассе, вы должны предоставить неабстрактный установщик в суперклассе, возможно, сам защищенный и названный, скажем, _setX. Тогда подкласс может использовать этот установщик.   -  person Jim Garrison    schedule 30.05.2016


Ответы (3)


Вы не можете установить частные поля суперкласса из подкласса. В этом случае сделайте свой x защищенным.

person Nikem    schedule 30.05.2016
comment
Правильно, так что это определенно невозможно. Решил, что стоит спросить, если это возможно, это, вероятно, было бы предпочтительнее. - person Space Ostrich; 30.05.2016
comment
Вы можете добавить защищенный сеттер к базовому классу и вызвать его из подкласса, если вы действительно чувствуете, что это что-то добавляет. Это, вероятно, не добавляет многого, если этот защищенный установщик не проверяет ввод или не имеет побочного эффекта, например. Ведение журнала. - person tpdi; 30.05.2016

Из Javadocs :The private modifier specifies that the member can only be accessed in its own class.

Так что, несмотря ни на что, вы не можете получить доступ к частной переменной вне класса IT.

person Nakul Kumar    schedule 30.05.2016

Переменная с модификатором доступа private ограничивает свою видимость для этого конкретного класса. Несмотря на то, что ваш метод установки переопределен как общедоступный, x недоступен из другого класса (mySubClass). Переопределенный метод находится в mySubClass, а x не виден из mySubClass.

person Nipun Thathsara    schedule 30.05.2016