文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>理解面向对象设计

理解面向对象设计

时间:2010-04-22  来源:qingfenghao

本人从事C++开发多年,下面是我个人的一些心得体会,写出来与大家共享、探讨。   C++比较 C 1.继承和多态

class A
{
public:
    virtual void init();
    void Do()
    {
        printf(m_str);
    }
  
    void Handle();
private:
     char m_str[100];
}
void A::init()
{
    strcpy(m_str, “AAA”);
}

void A::Handle()
{
    init();
    Do();
}


 
一个非常简单的例子,现在A::Handle()的功能就是调用init初始化成员m_str为
“AAA”,再调用Do将其打印。
调用者只需如下调用:
 

A a;
a.Handle();


 
如果现在有需求需要初始化该字符串为“BBB”,再将它打印,那么只需从A派生出
类B,重载实现init即可:

class B : public A
{
     virtual void init();
};

void B::init()
{
     strcpy(m_str, “BBB”);
}

如下调用:

B b
b.Handle();


在这里,只修改了一个函数init。如果使用C来实现情况会怎么样呢?

实现类A的代码是:

char m_str[100];
void init()
{
     strcpy(m_str, “AAA”);
}
void Do()
{
     printf(m_str);
}

void Handle()
{
    init();
    Do();
}

如果这时同样实现上述初始化m_str为 “BBB”的功能,而需要保留原实现,则首先需要增加函数init_BBB()如下:


void init_BBB()
{
    strcpy(m_str, “AAA”);
}

同时需要增加Handle_BBB()如下:
void Handle_BBB()
{
    init_BBB();
    Do();
}


 
使用C++只需要派生新类,重载实现虚函数init()即可,而使用C语言需要同时增加两个函数。为什么呢?因为在C++的实现中,因为类A中Handle()已经调用了虚函数init(),所以尽管它本身不是虚函数,但它的行为也是多态的。而使用C实现时,函数均为静态,从而如果需要增加新的功能,如果是影响了该模块的内部函数实现,那么需要增加所有相关的外围实现(调用者)。
而为什么限制不可以修改原有代码,因为它可能是第三方提供的一个类库或者函数库,我们根本没有源代码的实现。即便是我们自己内部的实现,对已经稳定的源代码的改动也不是很好的事情。因为最好重用而不是修改已有的实现。
 
这个例子有些简单,使用C来实现同样的新功能并没有比C++增加多大的工作量。但随着功能需求的复杂,使用C来实现新增的工作量可能会大得多。
 
2.分析
 
为什么C语言和C++会有这样的差别呢?原因就在于:
1.1) c的基于模块化设计思想,更多的是着眼于每个单个功能模块上的实现,而每单个功能的实现是静态的,只需要考虑本模块的实现即可。这样系统是功能模块上的静态组装叠加。从而已有功能在被重用时,也是静态的叠加或重组。而用C++实现时,把行为(函数)和属性(数据)进行封装,从而抽象为单独的对象,这样使用者只需要获得该对象指针或其他引用形式,就可以对它进行操作,从而实现该对象具备的所有功能,而不用象C语言中一样,很繁琐地使用大量的变量并且在函数间传来传去,在C++中,这些参数很多都被封装到类成员变量中,这既增加了安全性,也使得代码更加简洁。这就是C++封装的特点。
2) 在把函数和数据进行封装成对象后,还增加了更多更强大的功能,这就是继承和多态。继承使得派生类(子类)获得了基类(父类)几乎所有的功能,而它又可以增加自己的行为和属性,或者修改父类的行为或属性。这样,只要少许的代码改动就可以创造出一个新的对象,从而实现新的功能,而且对于使用者而言,它所需要的改动很少,几乎没有。
3)多态把继承的威力发挥地淋漓尽致,它使得派生类可以重载虚函数进而改变基类的行为,而使用者只需要通过基类指针来调用就可以调用到派生类的虚函数。如果没有多态,那么调用者就需要定义每一个具体的派生类对象的指针来调用它们,有了多态,它只需要定义基类指针,然后把它赋成实际派生类对象的指针就可以按照基类行为来使用各个派生类了,从而同样的代码将呈现出不同的功能,这就是多态。多态是通过运行时绑定来实现的。
4.4)在对象和对象之间建立联系后,功能将变得更加丰富。比如,一个对象可以调用另外一个对象的方法,或者它的成员中可以包含另一个对象。这样多个对象之间的继承、包含、组合、参数传递等就构成了一个模型----面向对象的设计模型,它可以解决一类问题,
    现在已有很多成熟的设计模型。一个好的设计模型着眼于把需要实现的功能抽象成多个有着继承、包含、组合等联系的对象,这样系统中所有的行为方式都是面向对象的行为方式。对象的很多行为是多态的,对象的种类是多样的,它们之间的逻辑关系也是复杂的,对于相同的事物,不同的人可以抽象出的不同的对象。但好的设计模型可以巧妙地抓住事物内一类或一系列对象内在的逻辑联系,这样它在实现已有功能的同时,也包含了对未实现功能的预扩展(实现)。也就是说,使用面向对象设计的时候,出发点不仅仅是实现当前的功能,而是基于当前的功能,设计出一个好的框架,具备良好的扩展性,有利于将来功能的实现,而当前功能只是该框架内的部分实现。
    当然了,使用C++并不是没有代价的,最大的问题就在于它的性能上(对象的拷贝、构造/析构函数的使用);其次因为它需要考虑到以后的扩展需求,所以逻辑设计上有时会有一些冗余。而且使用C++在设计上仍然会有不周的地方,Adapter模型就是对此的一个解决方案。此外,并不是所有的处理模型都适用于面向对象模型,有些不使用面向对象方法同样可以描述得非常好,甚至更好。
 
 
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载