• 面向对象三大要素-继承


    一、继承

    继承,就是面向对象中类与类之间的一种关系。继承的类成为子类、派生类,而被继承的类成为父类、基类或超类。通过继承,使得子类具有父类的属性和方法。同时子类可以通过加入新的属性和方法或者修改父类中的属性和方法建立新的类层次。

    继承按照实现方式的不同一般分为:

    实现继承:派生类继承了接口的所有属性和方法,并且只能有一个基类,在.NET 中System.Object是所有类型的最终基类,这种继承方式成为实现继承。

    接口继承:派生类继承了接口的方法签。不同于实现继承的是,接口继承允许多继承,同时派生类只继承了方法签名儿没有方法实现,具体的实现必须在派生类中完成。因此,确切的说,这种方位应该成为接口实现。

    继承的本质:

    • 继承是可传递的,子类是对父类的扩展,必须继承父类的方法,同时可以添加新方法。
    • 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。
    • 虚方法如何实现覆写操作,使得父类指针可以指向子类对象成员。
    • 子类不光继承父类的公共成员,同时还继承了父类的私有成员,只是在子类中不能访问。
    • new关键字在虚方法继承中的阻断作用

    new关键字在虚方法中动态调用的阻断作用:在子类方法中,如果标记new关键字,则意味着隐藏基类实现,其实就是创建了与父类同名的另一个方法,在编译中这两个方法处于方法表中的不同位置,父类方法排在前面,子类方法排在后面。

    实现集成和接口继承

    • 抽象类适合与族层概念的类间关系,而接口最适合为不同的类提供通用功能。
    • 接口着重与CAN-DO关系类型,而抽象类则偏重于IS-A式的关系。
    • 接口多定义对象的行为,抽象类多定于对象的属性。
    • 如果预计会出现版本问题,可以创建“抽象类”。
    • 因为值类型是密封的,所以只能实现接口,而不能继承类。

    类与类的关系:继承,聚合,依赖

    关于继承、聚合和依赖,请参考:http://www.cnblogs.com/scevecn/p/5663369.html

    面向对象的基本原则:多聚合,少继承;低耦合,高内聚。

    继承:

      是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性。

    class Animal{};
    
    class Tigger : public Animal{};
    
    class Dog : public Animal{};
    
    Animal* pAnimal = new Dog;

    实现:是一种类与接口的关系,表示类是接口所有特征和行为的实现. 一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;

     

    关联关系(Association) 

    //eg.1
    //单向关联
    class Person{};
    class Friend
    {
        Person mpPerson;
    }
    
    //eg.2
    //双向关联
    class A;
    class B
    {
        A pA;
    }
    class A
    {
        B pB;
    }
    
    //eg.3
    //自身关联
    class C
    {
        C pC;
    }

    聚合关系(Aggregation)

      

    class CPU{}
    class Memory{}
    class Computer
    {
      CPU mpCPU;
      Memory mpMemory;
    };

    组合关系(Compositive)

    class Leg{}
    class Arm{}
    class Person
    {
      Leg mLeg;
      Arm mArm;
    };

    依赖关系(Dependency)

    class Car{}
    class House{}
    class Person
    {
      void buy(Car car){}
      void buy(House pHouse){}
    };
    1.聚合与组合
    
    (1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
    
    (2)部件的生命周期不同
    
    聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
    
    组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
    
    (3)聚合关系是"has-a"关系,组合关系是"contains-a"关系。
    
    2.关联和聚合
    
    (1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
    
    (2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
    
    (3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
    
    (4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
    
    3.关联和依赖
    
    (1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
    
    (2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
    
    4.综合比较
    
    这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:
    
    组合>聚合>关联>依赖
    
  • 相关阅读:
    为Qtcreator 编译的程序添加管理员权限
    热备,冷备,云备
    最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
    进入2012 -- 回顾我走过的编程之路
    为什么中国程序员水平一直上不了层次?无非是这些原因!
    我是如何失去团队掌控的?
    后端开发甩锅奥义
    一个线程oom,进程里其他线程还能运行吗?
    架构师必备,带你弄清混乱的JAVA日志体系!
    IDEA一定要改的八条配置
  • 原文地址:https://www.cnblogs.com/zqg123/p/7141344.html
Copyright © 2020-2023  润新知