2016-04-03 16 views
3

Ich habe in vielen Diskussionen gelesen, dass protected Klassenmitglieder schlecht ist und ich sehe die Gründe dafür. Aber was ist die eleganteste Art und Weise, const int ageprivate zu machen und das Problem zu lösen, das sich daraus ergibt?Wie vermeidet man geschützte Klassenmitglieder?

#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

Wenn Sie "Alter" privat machen, müssen Sie Accessoren hinzufügen (d. H. Holen und setzen). Aber wirst du sie dann öffentlich machen? Soll das Alter außerhalb der Tierhierarchie verändert werden? Wenn nicht, müssen Sie es schützen, und dann sind Sie wieder bei dem gleichen Problem. –

+0

@Default, ist es nicht seltsam, Accessor-Funktionen zum Abrufen von Variablen aus einer Basisklasse zu verwenden? – Chiel

Antwort

6

Wenn Sie Gründe beziehen sind wie in Why is Clean Code suggesting avoiding protected variables?, müssen Sie auch im Auge behalten, dass diese Leitlinien sollen für reale Szenarien, in denen oft Vererbungshierarchien sind nicht so clearcut als Tier und Hund . Bei Anwendungen auf Unternehmensebene ist es für viele Entwickler verlockend, in Bezug auf Vererbung zu denken, als würde sie in Zukunft mehr Organisation bringen, aber in Wirklichkeit werden Variablen gedankenlos in die Basisklasse geworfen, im Laufe der Zeit die Struktur aufgebläht und der organisatorische Kontext erodiert seiner Mitglieder.

In Ihrem einfachen Fall ist die Verwendung von protected in Ordnung.

+0

Also alles in allem macht meine Lösung Sinn und für Programme mit einer einfachen Struktur ist es in Ordnung, "geschützt" in der Art zu verwenden, wie ich es verwende? – Chiel

+0

Es tut. In einem größeren Anwendungskontext ist ein Beispiel dafür, wie es keinen Sinn macht, wenn in der absehbaren Zukunft kein anderes Tier als Hund unterstützt werden muss, und du beginnst, "Alter" sowie andere Mitglieder in die Basis zu stellen Klasse. Aber in diesem Fall hättest du auch 'Animal' nicht erstellen sollen. (Es ist ein wenig schwierig, dieses Beispiel mit etwas Realem zu vergleichen.) –

+0

In dem Code, in dem ich diese Konzepte anwende, gibt es andere 'Animal's. Ich finde es merkwürdig, dass Menschen in Diskussionen über SO oft sehr dogmatisch sind (weshalb ich diese Frage aufgeschlagen habe). Es wäre großartig, ein minimales Beispiel zu haben, bei dem das geschützte Mitglied zu Problemen führt. – Chiel

Verwandte Themen