搭配很重要——继承与组合那些事

1.引子

      这个题目引出的中心意思表示想要讨论的核心是在面对类的设计时,何时适合使用组合?何时更适合使用继承?何时又适合两者兼备?

2.概念先理清

(1)组合:简而言之,将一个类对象的引用置于当前这个(要设计的)新类中作为其成员域(属性)。这种旧类与新类的关联方式称为“组合”。

(2)继承:这个特性是所有的OOP语言的共性,创建一个类时,总是在隐式或者显示地继承某个类。①隐式:创建一个类时如果不明确的通过"extends"关键字继承某个类,那么都是在隐式的继承Object类;②显示:即显示的通过“extends”语法方式继承某个类。

3.深一层的认识

(1)继承

〇继承用于表达"is-a"的关系,如台灯是一种灯

①在使用继承方式设计一个新类时,该新类将会自动得到基类中所有的域和方法(当然,子类直接访问父类的话,只能访问那些非private的类型)。那么在实现新类的功能时,就可以不用实现这些可以从父类能够获取到的功能,从这个角度看,继承的方式是一种对代码的复用,避免冗余。

②继承方式下,通过其构造方法对新类进行初始化时——即创建子类的对象实体时,在该对象中会隐式的包含父类的子对象,该子对象与通过父类直接创建的对象并无二致,区别仅在于前者被包装在子类对象内部,后者来自外部直接显示的创建。

(2)组合

〇组合用于表达“has-a”的关系,如果小汽车有四个轮子

      组合方式中,新类可以直接在其内部直接通过对象引用来操作组合类对象的任何开放的接口或域。还有更灵活的做法,组合的高级用法——可以称作代理(此代理非设计模式中的代理模式)。新类中各个调用引用对象的方法的功能与该引用对象的该方法功能相同甚至更强大(最好同名),可以说在新类中暴露了引用类的所有可调用方法(用了继承的思想)。代理即认为是中和单纯的继承和单纯的组合的一种中庸之道(java编程思想)。

4.应用场景和优缺点分析

  (1)继承:使用继承方式时,父类相对子类而言就是一个通用类,子类可以认为是通用类的特殊化。但是使用继承局限性较大,因为在决定继承哪个类时就注定了该新类的一般属性。继承的应用场景也很多,一般如果偏重在复用接口(方法)时比较适合使用继承方式。允许使用新类的用户能够使用该新类的接口和父类的接口

(2)组合:组合比起继承要灵活得多,这个典型的说服依据就是上一节(3.(2))中提到的代理。因为有时候直接使用引用对象的方法不足以满足新类方法的功能,那么可以在调用了该引用对象的方法的基础上加以改造,但方法功能依然不变,与引用对象的同名方法相同。。。组合方式中,更看重的是引用对象的类所代表的意思——类型意义。一般地,如果更想在新类中使用现有类的功能而非接口,那么很适合使用组合方式——在新类中嵌入一个现有类的对象的private类型,该对象实现了某些功能,可以为当前的新类直接使用。再解释一下,意思就是允许使用新类的用户看到的是该新类的接口而非该新类中引用的对象的接口

(3)代理:这种方式其实更应该归属于组合下面的一种更特殊的用法——适用于那些使用继承不太合适又不太合适仅使用组合的场景。

最后,关于继承和组合的选择有时候还不是很明晰的话,可以思考一下,究竟当前新开的新类是否需要从新类向基类转型。如果必须转,那么果断使用继承方式。还有些场景可能使用继承或者组合方式都无碍,那就都OK,估计还是考虑首选组合,在想想以后的扩展和兼容问题,也许就不纠结了,答案就水落石出了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值