分类:
2012-10-21 18:06:01
原文地址:理解面向对象设计1(继承和多态) 作者:qingfenghao
|
|
|
|
在这里,只修改了一个函数init。如果使用C来实现情况会怎么样呢?
实现类A的代码是:
|
如果这时同样实现上述初始化m_str为 “BBB”的功能,而需要保留原实现,则首先需要增加函数init_BBB()如下:
|
我在以前某项目中就曾经遇到过。
项目在version2.0时,需要增加对用户发出的SIP消息进行数字认证(Digest Authentication)的功能。当时采用类CDigestAuth来实现:
CDigestAuth *auth = new CDigestAuth(…); auth->Handle(); |
而在version 3.1时,system nonce除了存储在DB中,还会存储在Cache中,而程序需要首先从Cache中查询,如果找不到,再从DB中查找,这样GetNonce函数就需要重写。当时写了一个新类CMemDigestAuth从CDigestAuth继承:
CDigestAuth *auth = new CMemDigestAuth(…); auth->Handle(); |
为什么C语言和C++会有这样的差别呢?原因就在于:
1. C面向数据设计方式,采用模块化设计思想,在定义好模块间的接口后,更多地着眼于单个功能模块上的实现,而单个功能的实现是静态的。这样系统实现是各个功能模块的静态组装叠加。从而已有功能在被重用时,也是静态的叠加或重组。而用C++实现时,把行为(方法)和属性(数据)进行封装、抽象为单独的对象。使用者只能通过对象所提供的方法对它进行操作,屏蔽了内部实现细节。使用者拥有对象,就获得了该对象具备的所有功能。这不仅增加了安全性,而且对象的组合、包含使得功能多样化。
2. 继承使得子类获得了父类几乎所有的功能,而它又可以增加自己的行为和属性,或者修改父类的行为或属性。这样,只要少许的代码改动就可以创造出一个新的对象,从而实现新的功能,而且对于使用者而言,它所需要的改动很少,甚至没有。
3. 多态是继承的一个重要目的,尽管不是全部。子类可以重写虚函数而改变父类的行为,而使用者可通过父类对象就可以访问子类。如果没有多态,那么调用者就需要定义每一个具体的派生类对象的指针来调用它们,有了多态,它只需要记录父类指针来使用,但同样的代码可呈现出不同的功能,这就是多态。
4. 在对象和对象之间建立联系后,功能将变得更加丰富。比如,一个对象可以调用另外一个对象的方法,或者它的成员中可以包含另一个对象。这样多个对象之间的继承、包含、组合、参数传递等就构成了一个个面向对象的设计模型,它可以解决一系列问题,
现在已有很多成熟的设计模型,比如Composite(重合)、Bridge(桥接)等。一个好的设计模型着眼于把需要实现的功能抽象成多个有着继承、包含、组合等关系的对象,这样系统中所有的行为方式都是面向对象的行为方式。
对于相同的事物,不同的人可以抽象出的不同的对象。但好的设计模型可以巧妙地抓住事物内一类或一系列对象内在的逻辑联系和规律,并以面向对象的方式加以表达。
一个好的设计模型不仅可以实现已有功能,还具有良好的扩展性和复用性。或者说,好的设计模型都有一个好的框架。
当然,使用C++并不是没有代价的,最大的问题就在于它的性能上(对象的拷贝、构造/析构函数的使用等);其次面向对象的设计对开发者有更高的要求,因为面向对象的思维方式更难一些。最后,并不是所有的问题都适用于面向对象解决,有些使用面向过程更适合。