继承与复合的选择

Posted 爱叨叨的程序狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承与复合的选择相关的知识,希望对你有一定的参考价值。

继承与复合

继承与复合都可以在一定程度上对类进行扩展。

继承

假设,B类继承自A类,B类是A类的派生类,子类B具有A类的某些特性。那么可以说,A类和B类是同一种东西,也就能使用is-a来表示两者的关系-----继承。

继承分为接口继承和实现继承,两者主要的目标是代码重用。

举个例子

车具有引擎和车轮,奔驰车也具有引擎和车轮,同时奔驰车具备基础车不具备的Boss音响,即便如此,它仍然是车,因为它具备基础车所有的属性,只是在基础车上增加了Boss音响。用英语表示两者的关系是:BenzCar is Car.

使用XML图表示两者的关系:

@Data
public class Car 
    /**
     * 引擎
     */
    private String engine;
    /**
     * 轮子
     */
    private String wheel;

public class BenzCar extends Car
    private String bossSound;

复合

假设,B类需要引用A类的某些属性和功能,B类只需要A类的属性,并不需要暴露/知道A类的具体细节,当需要获取A类的属性或数据时,仅需要暴露A类的API提供访问就可以,我们认为,A类和B类不是同一种东西,B类只是需要A类的部分信息,也就能使用has-a来表示两者的关系-----复合。

B类的任何一个实例对象都可以调用现有方法来返回A类的结果,这种方式叫转发。

同样举个例子

车库里有各种各样的灯和不同的车,车库并不关心车库内有什么品牌的车,车本质上并不是车库的一部分,而是只需要实现停车的功能或者需要灯具实现照亮车库的功能,那么我们只需要在车库中包含车辆、灯具的实例就可以实现。

使用XML图表示两者的关系:

@Data
public class Opple 
    /**
     * 灯
     */
    private String light;

@Data
public class YeeLight 
    /**
     * 灯
     */
    private String light;

@Data
public class ParkLot 
    /**
     * 停车场需要欧普的灯实现照亮功能
     */
    private Opple opple;
    /**
     * 停车场需要yeeLight的灯实现照亮功能
     */
    private YeeLight yeeLight;
    /**
     * 停车场里有车,实现停车功能
     */
    private Car car;

Tips

无论继承还是复合,两者实质上都是对原有类进行扩展,只不过是方式不同、适用场景不同,两者XML合在一起长这样:

但是,我们在扩展类时

需要考虑的点:两者是is-a是与否的关系还是has-a包含关系?

需要遵循的原则是:复合优先于继承。

需要明确的点是:继承破坏了封装性,子类依赖于父类特定的功能和细节,但是父类在迭代中,子类可能会遭到破坏,可能导致子类出现坏结果。

以上是关于继承与复合的选择的主要内容,如果未能解决你的问题,请参考以下文章

HTML+CSS Day05 基本CSS选择器复合CSS选择器与CSS继承性

css的复合选择器

CSSCSS 复合选择器 ① ( 基础选择器与复合选择器 | 后代选择器 )

11.组合与继承

css复合选择器都有哪些

CSS3样式,基础选择器,复合选择器