对于C++程序而言,设计孤立的类比较容易,难的是正确设计基类及其派生类。
当前面向对象技术的应用热点是COM和CORBA
1.继承Inheritance
规则1: 如果类A和类B毫不相关,不可以为了B的功能更多些,而让B继承A的功能和属性
规则2: 若在逻辑上B是A的一种”a kind of“,允许B继承A的功能和属性
规则3: 继承的概念在程序世界和现实世界并不完全相同
在数学上,圆circle是一种特殊的椭圆ellipse,但是圆继承椭圆的长轴和短轴是不推荐的。
综合来讲:若在逻辑上B是A的”一种“,并且A的所有功能和属性对于B来说都是有意义的,则允许B继承A的功能和属性。
2.组合composition
规则1:如果在逻辑上A是B的一部分a part of,则不允许B从A派生,而是要用A和其他东西组合出B。
class Eye{
public: void Look(void);
}
class Nose{
public: void Smell(void);
}
class Mouth{
public: void Eat(void);
}
class Ear{
public: void Listen(void);
}
class Head{
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;
}
当前面向对象技术的应用热点是COM和CORBA
1.继承Inheritance
规则1: 如果类A和类B毫不相关,不可以为了B的功能更多些,而让B继承A的功能和属性
规则2: 若在逻辑上B是A的一种”a kind of“,允许B继承A的功能和属性
规则3: 继承的概念在程序世界和现实世界并不完全相同
在数学上,圆circle是一种特殊的椭圆ellipse,但是圆继承椭圆的长轴和短轴是不推荐的。
综合来讲:若在逻辑上B是A的”一种“,并且A的所有功能和属性对于B来说都是有意义的,则允许B继承A的功能和属性。
2.组合composition
规则1:如果在逻辑上A是B的一部分a part of,则不允许B从A派生,而是要用A和其他东西组合出B。
class Eye{
public: void Look(void);
}
class Nose{
public: void Smell(void);
}
class Mouth{
public: void Eat(void);
}
class Ear{
public: void Listen(void);
}
class Head{
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;
}