Как получить доступ к атрибуту родительского класса, не нарушая инкапсуляцию данных? - PullRequest
0 голосов
/ 06 июня 2019

В книге 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

1 Ответ

0 голосов
/ 07 июня 2019

Наконец-то я нашел очевидное решение: переопределить атрибут private родительского класса в подклассе:

class Person:

    def __init__(self, age):
        self.__age = age  # private attribute


class Employee(Person):

    def __init__(self, age):
        self.__age = age  # private attribute

    def get_salary(self):
        return 5000 * self.__age


Employee(32).get_salary()  # 160000
...