您的位置:首页 > 其它

面向对象的三大特性

2010-04-01 11:14 211 查看
向对象(Object Oriented,缩写为OO)是现代软件技术的精髓

三个基本的特性:封装、继承与多态。

1、封装性(Encapsulation)
    所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。OO将万物都视为“对象”(Object),任何对象都具有特性和行为。我们将其特性称为“成员变量” (MemberVarible),将其行为称之为“成员函数"(Member Function),被封装的特性只能通过特定的行为去访问。
    大家都见过旅馆里常用的一种茶叶吧,就是用纸袋把茶叶包装起来再系是一根线。用的时候只需要将其放在水杯里泡就行。这样的好处是不会将茶叶渣和茶垢弄的满杯子都是。
    好!这就是一个封装的例子。
    我们喝茶的目的是享受茶叶的香冽;所以茶叶的味道(Flavour)就是茶叶所具有的最
重要特性之一;可是我们无法直接享受它的清香,因为被外面的纸袋“封装”起来了。唯一的办法就是“泡”(Dilute),将茶袋扔在开水中泡,它的味道就出来了,融入水中。
    如果我们把袋装茶叶看作一个对象的话,它提供了成员变量Flavour和成员函数Dilute
。并且Flavour是私有(Private)的,我们不能直接把它吞进肚子去,而只能通过成员函
数Dilute才能享受Flavour。
    下面用C++代码来描述这个例子:
    Class CTea
    {
       Private:
          Cstring m_Flavour; //味道
          Cstring m_Color;   //颜色
          ......      //等等其它属性
       Private:
          Void CTea(); //构造函数
          Void ~CTea(); //析构函数
       Public:
          Cstring Dilute();//沏茶
          ......      //等等其它方法
       }
      Cstring CTea::Dilute()
      {
          //怎样泡出味道来的代码
      }
    这就是封装。通过将对象的某些属性声明为Private隐藏起来,只能使用其提供的特定
方法去访问。
2、继承(Inheritance)
    如果只是封装,那么非面向对象语言也能部分的做到。比如在C中,用结构(Struct)、
VB中用自定义类型(Type)也能封装一些变量。
    OO最有吸引力的特性是继承。通俗的说后代具有祖先的某些特点就叫继承,当然后代还可以具有自己独有的特征。举个例子吧,菜刀。
    菜刀(cutlery)是钢(Steel)做的,钢是一种金属(Metal),金属则是大千世界里的一种物质(Substance)。所以菜刀的一些特性可以追溯到物质具有的一般属性。正是因为这个道理,MFC中所有类均从CObject继承而来。
    这就是继承。菜刀直接继承了钢的特性,钢又继承了金属的特性,......下面的代码描
述了这种复杂而有独特的继承关系:
    Class CSubstance
{
    Private:
    int m_color;
    void CSubstance();
    void ~CSubstance();
    //......(我是学文科的,具体属性说不上来)
   }
    Class CMetal:Public CSubstance
   {
    void CMetal();
    void ~CMetal();
    //......
    }
    Class CSteel:Public CMetal
   {
     void CSteel();
     void ~CSteel();
     //......
    }
    Class CCutlery:Public CSteel
    {
      private:
       Cstring m_Blade;
       void CCutlery();
       void ~CCutlery();
       //......
       Public:
       void Cut();
     }
    这里,CSubstance被称为基类(Base class),其它被称为衍生类(Derived class)。衍生类与基类是“Is kind of”的关系。子类与其祖先类之间复杂的函数调用关系不在本文讨论之列。
    继承是一种树状的层次关系。子类在继承祖先类的成员变量和成员函数的同时也可以
定义自己的成员变量和成员函数。比如,Metal 除了继承了Substance的一般特性外,还具有自己的属性诸如可延展性;CCutlery在继承CSteel的特性后还具有自己的成员诸如“刀刃”(Blade)、“锋利”(Sharpness)、行为有如“切”(Cut)等。
     面向对象技术是对现实生活的抽象,你可以用生活中的经验去思考程序设计的逻辑。
3、多态性(Polymorphism)
    讨论多态之前先要明白什么是“虚拟”(Virtual)。C++/MFC就是用虚拟这种方式实现多态的。为什么“虚拟”这个概念?看下边的例子:
    Class Cincect //昆虫类
    {
     private:
        int m_foot;     //脚的数量
        ......          //其它成员变量
     private:
        void Cincect();
        void ~Cincect();
     public:
        void Bite()//咬人
        {
         ......   //怎样咬人的代码,比如张开嘴啃
         }
     }
    我把Bite(咬)这个动作在基类中定义为一般化动作。可是,不是所有昆虫咬
人的方法都一样(况且还有的根本就不咬人呢,比如蜻蜓),比如蚊子是用嘴那个
吸管叮人而蚂蚁是用嘴去夹。
    从昆虫这个类别衍生出以下两个类别:Cant(蚂蚁)、Cmosquito(蚊子)。
     class Cant :public Cincect //蚂蚁类
    {
     ......
     }
     class Cmosquito :public Cincect //蚊子类
     {
      ......
      }
    它们都继承了Cincect的所有成员,当然也继承了Bite()这个动作。现在就有问题了:
同样继承自昆虫,当我们使用Bite()这个动作时怎么才能区分蚂蚁和蚊子各自的独有的咬人方式呢?
    方法之一是用“::”符号指明具体引用的是那一个,但这样明显失去了灵活性;
    另一种方法就是“虚拟”。使用关键字virtual将Bite()声明为虚拟函数,然后在每个
衍生类中重新定义,描述它们各自的咬人方法,调用的时候也不会都一种结果啦。于是上边的例子可以改写为:
Class Cincect //昆虫类
    {
     private:
        int m_foot;     //脚的数量
        ......          //其它成员变量
     private:
        void Cincect();
        void ~Cincect();
     public:
        virtual Bite(){}//咬人,但我们只声明这个成员函数,
                        //却让它什么动作都不做,让衍生类自己去定
                        //义各自的咬人方法
      }
     class Cant :public Cincect //蚂蚁类
    {
     ......
     virtual Bite();
     }
     Cant::Bite()
     {
      ...... //蚂蚁具体的咬人方式
     }
     class Cmosquito :public Cincect //蚊子类
     {
      ......
      virtual Bite();
     }
     Cmosquito::Bite()
     {
      ...... //蚊子具体的咬人方式
     }
    所以,虚拟的目的是只在基类中将一般化动作声明一个成员函数的原型而不做
具体定义,让衍生类自己去定义。
    这就是面向对象的特征之三:多态性。基类的同一个成员在不同的衍生类中可以具
有不同的形态,更好地抽象和描述大千世界中的诸多“对象”。

以上文章转自:http://blog.csdn.net/ansontang/archive/2008/03/03/2144692.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: