前言
第一次尝试写技术文章,前期可能主要是一些总结类的。后期才会慢慢加入自己的理解吧。主要内容来自于 Thinking in Java
组合
组合的意思很简单,就是 has-a 的关系,也就是说有什么东西。举个例子,一辆汽车里面需要有座椅,这个座椅我不必“从头设计”,可以直接从“座椅”分类里面拿来用就是了,同样的一个座椅,我可以用在捷达车上,也可以用在桑塔纳上,这就是组合了。
继承
熟悉 OOP 的同学想必都说烂了吧,一只鸡也是一只鸟,有翅膀,会下蛋等等。这就是继承了。但是这个例子其实不好,因为我很难去“实例话”一只鸡。举个更好的例子可能还是汽车。嗯,只要把“帕萨特”稍微修改一下就变成了“辉腾”。这个可能就更像是继承的意思了。(其实辉腾是辆好车,内部特别宽敞。顺便黑一下大众的车型。)
继承中子类拥有父类的“全部”(除了private
的)特征。你可以直接调用父类的函数。但是你不能“重载”父类的private
方法,你可以写一个跟父类拥有同样名字的private 方法,但是它们之间只是正好重名了而已,可以完全不相关。
class Car{
private void drive(){
System.out.println("The car is drived.")
}
}
public class Honda extends Car{
Honda (){
System.out.println("This is child");
}
private void drive(){
System.out.println("Honda is cheap.");
}
}
代理
第一次接触到这个概念的时候我有点奇怪,因为它看起来跟组合实在是没什么太大的差异。
然后…… 我又仔细看了一遍,原来区别在于“是否暴露代理对象的方法”。当然,这是书上看来的,在我开来这里的暴露,其实还不如说是一种“封装”。也就是我可以直接用新类中的方法,而不是通过调用该类中的子对象的方法。这句话说起来有点绕。还是用前面椅子和车子的例子,同样是一把椅子,如果我用椅子自带的手柄来调整座椅,那么就是组合。如果我把这手柄跟电子系统连起来,用车上的电子系统来调整座椅,那么就是代理了。也就是说我通过“代理人”来操作对象就是代理,如果我直接操作就是组合。
总结
不管是代理
,继承
还是组合
都是我们代码复用的方式你完全可以组合使用,而不是单一的认准某一种方式。 大家都知道继承是OOP中十分重要的概念,但是继承其实并不是最好的代码复用方式。因为“耦合性”的问题,关于耦合性我还不是特别清楚,可以留着以后来慢慢说。
最好只在有“向上转型”(upcasting)的必要的时候再使用继承。在安卓中常用的例子就是 findViewById()
方法了,所有需要注册的组建都继承自View
类,这样我们就可以用统一的方法把它们找出来。当然随着工程的增大,写findViewById()
也是挺烦人的,所有才有了ButterKnife 这样的库来方便我们的工程。
好了今天的内容就到这里吧,其实就是炒炒冷饭,大家都懂得,我只是拿来教自己一遍。欢迎拍砖,谢谢指教。
网友评论