В книге 1994 года Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения от "Банды четырех" я заметил в примерах кода на C ++, что все методы либо объявлены как public
или protected
(никогда не как private
), так и что все атрибуты объявлены как private
(никогда не как public
или protected
).
В первом случае, я предполагаю, что авторы использовали protected
методы вместо private
методов, чтобы разрешить наследование реализации (подклассы могут делегировать им).
Во втором случае, в то время какЯ понимаю, что исключение атрибутов public
и protected
предотвращает нарушение инкапсуляции данных, как обойтись без них, если подклассу требуется доступ к атрибуту родительского класса?
Например, следующееКод Python вызвал бы AttributeError
при вызове метода get_salary()
, если бы атрибут _age
был private
вместо protected
, то есть если бы он был назван __age
:
class Person:
def __init__(self, age):
self._age = age # protected attribute
class Employee(Person):
def get_salary(self):
return 5000 * self._age
Employee(32).get_salary() # 160000