zoukankan      html  css  js  c++  java
  • 高质量C /C编程指南第10章 类的持续与组合

    第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#多线程下更新UI的几种方法
    .net WebApi使用swagger 美化接口文档
    C#内存管理
    LINQ 推迟查询的执行
    C#多播委托详解
    泛型委托
    使用 ref 和 out 传递数组注意事项
    何时使用委托而不使用接口
    委托中的协变和逆变
    细说SQL Server数据类型
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1974598.html
Copyright © 2011-2022 走看看