高质量C /C编程指南---第10章 类的接受与组合
2011-03-07 17:01
197 查看
第10章 类的接受与组合
对象(Object)是类(>)的一个实例(Instance)。如果将对象比作房子,那么类便是房子的筹划图纸。以是面向对象筹划的重点是类的筹划,而不是对象的筹划。
关于C 顺序而言,筹划伶仃的类是对照苟且的,难的是精确筹划基类及其派生类。本章仅仅叙说“接受”(Inheritance)和“组合”(Composition)的概念。
详尽,当反面向对象身手的使用抢手是COM和CORBA,这些内容凌驾了C 讲义的范畴,请阅读COM和CORBA相干论著。
10.1 接受
如果A是基类,B是A的派生类,那么B将接受A的数据和函数。例如:>
{
public:
void Func1(void);
void Func2(void);
};
>
{
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派生。
>
{
…
};
>
{
…
};
>
{
…
};
u 详尽事变
【规律10-1-2】看起来很复杂,但是抱负使用时可以或者会有意外,接受的概念在顺序全国与抱负全国并不完全近似。
例如从生物学角度讲,鸵鸟(Ostrich)是鸟(Bird)的一种,按理说类Ostrich应该可以从类Bird派生。但是鸵鸟不能飞,那么Ostrich::Fly是什么器材?
>
{
public:
virtual void Fly(void);
…
};
>
{
…
};
例如从数学角度讲,圆(Circle)是一种特殊的椭圆(Ellipse),按理说类Circle应该可以从类Ellipse派生。但是椭圆有长轴和短轴,如果圆接受了椭圆的长轴和短轴,难道弄巧成拙?
以是愈加紧张的接受规律理当是:若在逻辑上B是A的“一种”,而且A的全部效率和属性对B而言都故意义,则应许B接受A的效率和属性。
10.2 组合
l 【规律10-2-1】若在逻辑上A是B的“一部分”(a part of),则不应许B从A派生,而是要用A和其余器材组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,以是类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生而成。如示例10-2-1所示。
>
{
public:
void Look(void);
};
>
{
public:
void Smell(void);
};
>
{
public:
void Eat(void);
};
>
{
public:
void Listen(void);
};
// 精确的筹划,固然代码冗长。
>
{
public:
void Look(void) { m_eye.Look(); }
void Smell(void) { m_nose.Smell(); }
void Eat(void) { m_mouth.Eat(); }
void Listen(void) { m_ear.Listen(); }
private:
Eye m_eye;
Nose m_nose;
Mouth m_mouth;
Ear m_ear;
};
示例10-2-1 Head由Eye、Nose、Mouth、Ear组合而成
如果应许Head从Eye、Nose、Mouth、Ear派生而成,那么Head将主动具有Look、 Smell、Eat、Listen这些效率。示例10-2-2非常冗长而且运转精确,但是这种筹划门径却是纰谬的。
// 效率精确而且代码简练,但是筹划门径纰谬。
>
{
};
示例10-2-2 Head从Eye、Nose、Mouth、Ear派生而成
一只公鸡用力地追打一只刚下了蛋的母鸡,你知道为什么吗?
因为母鸡下了鸭蛋。
许多顺序员经不起“接受”的诱惑而犯下筹划错误。“运转精确”的顺序不见得是高质量的顺序,此处便是一个例证。
版权声明:
原创作品,应许转载,转载时请务必以超链接体例标明文章 原始情由 、作者信息和本声明。否则将究查轨则责任。
相关文章推荐
- 高质量C /C编程指南---第10章 类的持续与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南 -- 第10章 类的继承与组合
- 高质量C++/C编程指南(第10章 类的继承与组合)
- 高质量C++/C编程指南 - 第10章 类的继承与组合
- 高质量C/C++编程指南--文件结构
- 高质量C++/C编程指南 -- 第5章 常量
- 高质量C++/C编程指南[8]
- (轉貼) 高质量C++/C编程指南 (C/C++)
- 高质量C++/C编程指南 - 第11章 其它编程经验 参考文献
- 高质量C++/C编程指南 -- 第7章 内存管理 P4
- 高质量C/C++编程指南--表达式和基本语句
- 高质量C /C编程指南---第9章 类的机关函数、析构函数与赋值函数
- 高质量C /C编程指南---附录B :C /C试题和答案
- 高质量C++/C编程指南 -- 第7章 内存管理 P5
- 高质量C++/C编程指南 -- 第11章 其它编程经验