Почему не следует объявлять переменную, защищенную для наследования? - PullRequest
4 голосов
/ 27 октября 2011

Я прочитал из литературы, что переменная не должна быть объявлена ​​protected только для того, чтобы она могла оставаться видимой в дереве наследования.

Почему так?

Ответы [ 3 ]

14 голосов
/ 27 октября 2011

Поля являются деталями реализации - их, как правило, не следует рассматривать как часть API - таким образом, вы можете точно изменить способ хранения вещей в дальнейшем.Если вы сделаете поле защищенным, оно будет доступно для подклассов, а не для того, чтобы подкласс только мог видеть API, на который они могут положиться.

Что если вы хотите ограничить, какие значения действительны для этого поля вболее поздняя дата?Когда он защищен, вы не получаете никакой проверки или чего-либо подобного.Подклассы могут положить туда любой старый мусор.Если вы держите его в секрете и предоставляете защищенный метод установки, вы можете применить соответствующую проверку.

Вкратце: рассматривайте ваши клиенты через субклассификацию как клиентов во многом так же, как ваши клиенты через вызов.Дайте им API для работы и сохраните детали реализации в секрете.

3 голосов
/ 27 октября 2011

В большинстве случаев, когда я создаю наследование, я проверяю, что все переменные являются частными.Всякий раз, когда унаследованный класс хочет получить что-то от суперкласса, он может получить значения с помощью методов getter.

Если бы каждый мог получить и установить переменную хардкорным способом, нет никакого способа полагаться на дополнительныекод, который должен быть запущен при установке этой переменной.Суперкласс раздает свои обязанности.

0 голосов
/ 05 июня 2013

Это понятие наследования. Если класс A наследуется от класса B, то он имеет доступ к защищенным переменным и функциям. поэтому, если вы не хотите предоставлять доступ к какому-либо другому классу, тогда объявите его как Private.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...