2016-04-03 4 views
3

Я читал во многих дискуссиях, что у членов класса protected плохо, и я вижу причины этого. Но с учетом приведенного ниже примера, что является самым элегантным способом сделать const int ageprivate и решить проблему, которая возникает из-за этого?Как избежать защищенных членов класса?

#include <iostream> 

class Animal 
{ 
    public: 
     Animal(const int age) : age(age) {} 
     void print_age() const { std::cout << age << std::endl; } 
    protected: 
     const int age; 
}; 

class Dog : public Animal 
{ 
    public: 
     Dog(const int age) : Animal(age) {} 
     void bark() const 
     { 
      if (age >= 1) 
       std::cout << "Woof!" << std::endl; 
      else 
       std::cout << "(...)" << std::endl; 
     } 
}; 

int main() 
{ 
    Dog dog(1); 
    dog.print_age(); 
    dog.bark(); 
    return 0; 
} 
+0

'int getAge() const {return age; } '? – Default

+0

Если вы делаете 'age' private, вам нужно добавить аксессоров (т. Е. Получить и установить). Но тогда вы сделаете их публичными? Предполагается, что возраст должен быть изменен вне иерархии животных? Если нет, вы должны защитить его, а затем вернуться к той же проблеме. –

+0

@Default, не странно ли использовать функции доступа для извлечения переменных из базового класса? – Chiel

ответ

6

Если вы имеете в виду таких причин, как в Why is Clean Code suggesting avoiding protected variables?, вы также должны иметь в виду, что эти рекомендации предназначены для реальных сценариев, где часто наследование иерархий не так, как сплошные рубки животных и собака , В приложениях уровня предприятия задумывается, что многие разработчики думают с точки зрения наследования, как если бы это привело к большей организации в будущем, но в действительности переменные бездумно выбрасываются в базовый класс, со временем раздувают структуру и подрывают организационный контекст его членов.

В вашем простеньком случае, используя protected в порядке.

+0

Итак, мое решение имеет смысл, и для программ с простой структурой это нормально использовать 'protected' в том, как я его использую? – Chiel

+0

Он делает. Однако в более широком контексте приложения пример того, как это не имеет смысла, заключается в том, что в обозримом будущем нет необходимости поддерживать какое-либо животное, кроме собаки, и вы начинаете ставить «возраст», а также других членов в базе класс. Но, конечно, в этом случае вы не должны были бы создавать «Animal». (Немного сложно сравнить этот пример с чем-то более реальным.) –

+0

В коде, где я применяю эти понятия, есть другие 'Animal's. Мне показалось странным, что люди часто очень догматичны в дискуссиях о SO (вот почему я открыл этот вопрос). Было бы замечательно иметь минимальный пример, когда защищенный член приводит к проблемам. – Chiel

 Смежные вопросы

  • Нет связанных вопросов^_^