【问题标题】:How to avoid protected class members?如何避免受保护的类成员?
【发布时间】:2016-07-23 07:31:19
【问题描述】:

我在许多讨论中读到拥有protected 班级成员是不好的,我明白了其中的原因。但是鉴于下面的示例,制作const int age private 并解决由此产生的问题的最优雅的方法是什么?

#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;
}

【问题讨论】:

  • int getAge() const{ return age; }?
  • 如果你将age设为私有,那么你需要添加访问器(即获取和设置)。但是你会把它们公之于众吗?年龄是否应该在动物等级之外进行修改?如果没有,您必须对其进行保护,然后您又回到了同样的问题。
  • @Default,使用访问器函数从基类中检索变量是不是很奇怪?
  • @MariusBancila,程序中没有年龄是不变的,也没有修改。

标签: c++ oop protected


【解决方案1】:

如果您指的是诸如 Why is Clean Code suggesting avoiding protected variables? 中的原因,您还需要记住,这些指南适用于实际场景,在这些场景中,继承层次结构通常不像 Animal 和 Dog 那样明确。对于企业级应用程序,许多开发人员很容易从继承的角度来思考,好像它会在未来带来更多的组织,但实际上变量被不假思索地扔到基类中,随着时间的推移使结构膨胀并侵蚀组织上下文其成员。

在您的简单情况下,使用 protected 就可以了。

【讨论】:

  • 总而言之,我的解决方案确实有意义,对于具有简单结构的程序,可以按照我的使用方式使用protected 吗?
  • 确实如此。但是,在更大的应用程序环境中,如果在可预见的未来不需要支持除狗以外的任何动物,那么它不会 有意义的一个例子是,您开始将age 设置为以及基类中的其他成员。但当然,在这种情况下,您也不应该创建 Animal。 (将这个例子类比到更真实的世界有点棘手。)
  • 您问过如何避免使用protected。好吧,如果问题在于您使用了不需要的层次结构,那么答案是:摆脱Animal。但显然你有充分的理由使用Animal,所以这个建议没有意义。但在现实世界的情况下,有时这确实是答案:“你一开始就使用了错误的结构。”或者至少,“把它放在派生类中,你不会在其他类中使用它。” (但这对你的例子也没有意义,age 似乎对Animal 是通用的。)
猜你喜欢
  • 2017-02-22
  • 1970-01-01
  • 2014-09-10
  • 2017-08-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多