2016-04-03 8 views
3

J'ai lu dans de nombreuses discussions qu'ayant protected membres de la classe est mauvais et je vois les raisons pour cela. Mais vu l'exemple ci-dessous, quelle est la manière la plus élégante de faire const int ageprivate et de résoudre le problème qui en découle?Comment éviter les membres protégés de la classe?

#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

Si vous définissez 'age' comme privé, vous devez ajouter des accesseurs (c'est-à-dire obtenir et définir). Mais alors allez-vous les rendre publics? L'âge est-il censé être modifié en dehors de la hiérarchie animale? Sinon, vous devez le protéger, et vous revenez au même problème. –

+0

@Default, n'est-il pas étrange d'utiliser des fonctions d'accesseur pour extraire des variables d'une classe de base? – Chiel

Répondre

6

Si vous faites référence à des raisons telles que dans Why is Clean Code suggesting avoiding protected variables?, il faut aussi garder à l'esprit que ces lignes directrices sont destinées à des scénarios réels, où les hiérarchies souvent d'héritage ne sont pas aussi que des animaux et clearcut Dog . Avec les applications d'entreprise, il est tentant pour beaucoup de développeurs de penser en termes d'héritage comme si cela allait apporter plus d'organisation à l'avenir, mais en réalité les variables sont jetées dans la classe de base, au fil du temps. de ses membres.

Dans votre cas simple, l'utilisation de protected est correcte.

+0

Donc, dans l'ensemble, ma solution a du sens et pour les programmes avec une structure simple, il est bon d'utiliser 'protected 'dans la façon dont je l'utilise? – Chiel

+0

C'est le cas. Dans un contexte d'application plus large cependant, un exemple de ce qui n'aurait pas de sens est s'il n'y a pas besoin de soutenir un autre animal que Dog dans un avenir prévisible, et vous commencez à mettre l'âge ainsi que les autres membres dans la base classe. Mais bien sûr, dans ce cas, vous ne devriez pas avoir créé 'Animal' non plus. (Il est un peu compliqué d'assimiler cet exemple à quelque chose de plus réel.) –

+0

Dans le code où j'applique ces concepts, il y a d'autres 'Animal's. Je trouve bizarre que les gens soient souvent très dogmatiques dans les discussions sur SO (c'est pourquoi j'ai ouvert cette question). Ce serait génial d'avoir un exemple minimal où le membre protégé conduit à des problèmes. – Chiel