2016-04-03 15 views
3

protected sınıf üyelerine sahip olmanın kötü olduğunu ve bunun nedenlerini görüyorum. Ancak aşağıdaki örnekte, const int ageprivate'u yapmanın ve bundan kaynaklanan sorunu çözmenin en zarif yolu nedir?Korumalı sınıf üyelerinden nasıl korunulur?

#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 {dönüş yaşı; } '? – Default

+0

Eğer 'yaş' özel yaparsanız, o zaman erişim sağlayıcıları eklemelisiniz (örneğin, al ve ayarla). Ama sonra onları halka açacak mısın? Yaşın hayvan hiyerarşisinin dışında değiştirilmesi mi gerekiyor? Eğer değilse, onu korumalı hale getirmelisiniz ve sonra aynı soruna geri döndünüz. –

+0

@Default, bir temel sınıftan değişkenleri almak için erişimci işlevlerini kullanmak garip değil mi? – Chiel

cevap

6

böyle Why is Clean Code suggesting avoiding protected variables? gibi nedenlerle atıfta ediyorsanız, aynı zamanda bu kurallar kalıtım hiyerarşileri Hayvan ve Köpek gibi seçik değildir çoğu zaman gerçek dünya senaryoları, içindir akılda tutmak gerekir . Kurumsal düzeyde uygulamalarla, pek çok geliştiricinin miras açısından daha fazla organizasyon getirecekmiş gibi düşünmesi cazip gelebilir, ancak gerçekte değişkenler tabana zahmetsizce atılır, zaman içinde yapıyı şişirir ve örgütsel bağlamı aşındırır. Üyelerinin

Basit kasanızda protected kullanımı iyi.

+0

Sonuç olarak, benim çözümüm mantıklı ve basit bir yapıya sahip programlar için kullanmakta olduğum şekilde 'korumalı' kullanmak tamamen uygun mu? – Chiel

+0

Yapıyor. Ancak daha büyük bir uygulama bağlamında, nasıl bir anlam ifade etmeyeceğine dair bir örnek, öngörülebilir gelecek için Dog'tan başka bir hayvanı desteklemenin gerekmemesi ve “yaşın” yanı sıra diğer üyeleri de kurmaya başlamanızdır. sınıf. Ama tabi ki, bu durumda da 'Hayvan' yaratmamış olmalısın. (Bu örneği daha gerçek bir dünyaya benzetmek biraz zor.) –

+0

Bu kavramları uyguladığım kodda başka 'Hayvan'lar var. İnsanların SO üzerine yapılan tartışmalarda genellikle çok dogmatik olduğunu garip buluyorum (bu yüzden bu soruyu açtım). Korunan üyenin sorunlara yol açtığı asgari bir örneğe sahip olmak harika olurdu. – Chiel

İlgili konular