Bjarne Stroustrup曾经说过,他只能使用私有或公共成员变量处理大多数任务,并且他很少在他的设计中使用protected
成员变量。我在其他地方也听过类似的论点。这是一个例子,
class BaseClass
{
...
private:
int m_iAge;
double m_dSalary;
string m_strName;
bool m_bGender;
}
class SubClass : public BaseClass
{
...
}
鉴于上述类设计,子类SubClass
如何使用BaseClass
中定义的变量?
问题1 >为什么我们更愿意使用private
而不是protected
变量?这是BaseClass
隐藏实现细节并使其易于进一步改进的原因吗?
问题2 >为了让SubClass
访问BaseClass
中定义的变量,在我看来,我们必须定义公共访问(get / set)。然而,getter / setter是邪恶的!所以第二种选择是定义受保护的访问(get / set)。还有更好的主意吗?
谢谢
答案 0 :(得分:2)
Bjarne的观点是,派生类通常不应该访问基类的变量 - 这样做经常会导致维护问题。不,将其更改为使用get
/ set
(访问者/更改者)功能并不是一种改进。
答案 1 :(得分:1)
问问自己 - 为什么派生类会改变m_bGender
的值?还是m_iAge
?基类是否已正确处理这些值?
请参阅,通常不需要 直接访问基类的内部。所以我们将它们设为私有,并使用类的公共接口。
在一些非常罕见的情况下,如果派生类需要一些特殊的接口,则可能还有一个或两个受保护的函数。但那是不寻常的。如果派生类具有不同的行为,我们通常会使用虚函数。
答案 2 :(得分:0)
我认为这种说法的基本原理是,在许多情况下,子类化通常不会改变现有(继承字段)的行为,而是添加字段并添加操作新字段的新方法。
如果您正在寻找一种操作未受保护的继承成员的方法,您可以在基类中使派生类成为朋友。但是你必须提前知道它。
答案 3 :(得分:0)
使用私有的受保护成员的唯一主要原因是在子实现中确实不需要它们。那是为什么我们有受保护的成员,因为有些情况下子类确实需要直接访问父类的成员。我认为Stroustrup指的是一种设计,即首先不需要访问父成员,而子类只是建立在其父级的功能上,而不是修改其父级的功能。
但是,getter / setter是邪恶的!
为什么这样?根据我的经验,吸气剂和制定者是OOP的重要组成部分。有充分的理由与类建立接口,而不是直接访问它的变量。