高质量C++/C编程指南-第10章-类的担任与组合(1)
工具(Object)是类(Class)的一个实例(Instance)。假如将工具比作屋子,那么类就是屋子的设计图纸。所以面向工具设计的重点是类的设计,而不是工具的设计。 对付C++措施而言,设计孤独的类是较量容易的,难的是正确设计基类及其派生类。本章仅仅阐述“担任”(Inheritance)和“组合”(Composition)的观念。
留意,当前面向工具技能的应用热点是COM和CORBA,这些内容超出了C++课本的领域,请阅读COM和CORBA相关论著。
10.1 担任
假如A是基类,B是A的派生类,那么B将担任A的数据和函数。譬喻:
class A
{
public:
void Func1(void);
void Func2(void);
};
class B : public A
{
public:
void Func3(void);
void Func4(void);
};
main()
{
B b;
b.Func1(); // B从A担任了函数Func1
b.Func2(); // B从A担任了函数Func2
b.Func3();
b.Func4();
}
这个简朴的示例措施说明白一个事实:C++的“担任”特性可以提高措施的可复用性。正因为“担任”太有用、太容易用,才要防备乱用“担任”。我们该当给“担任”立一些利用法则。
l 【法则10-1-1】假如类A和类B绝不相关,不行觉得了使B的成果更多些而让B担任A的成果和属性。不要以为“白吃白不吃”,让一个好端端的结实青年无缘无故地吃人参补身体。
l 【法则10-1-2】若在逻辑上B是A的“一种”(a kind of ),则答允B担任A的成果和属性。譬喻汉子(Man)是人(Human)的一种,男孩(Boy)是汉子的一种。那么类Man可以从类Human派生,类Boy可以从类Man派生。
class Human
{
…
};
class Man : public Human
{
…
};
class Boy : public Man
{
…
};
u 留意事项
【法则10-1-2】看起来很简朴,可是实际应用时大概会有意外,担任的观念在措施世界与现实世界并不完全沟通。
譬喻从生物学角度讲,鸵鸟(Ostrich)是鸟(Bird)的一种,按理说类Ostrich应该可以从类Bird派生。可是鸵鸟不能飞,那么Ostrich::Fly是什么对象?
class Bird
{
public:
virtual void Fly(void);
…
};
class Ostrich : public Bird
{
…
};
譬喻从数学角度讲,圆(Circle)是一种非凡的椭圆(Ellipse),按理说类Circle应该可以从类Ellipse派生。可是椭圆有长轴和短轴,假如圆担任了椭圆的长轴和短轴,难道多此一举?
所以越发严格的担任法则该当是:若在逻辑上B是A的“一种”,而且A的所有成果和属性对B而言都有意义,则答允B担任A的成果和属性。