[旧文搬迁]闲扯Java面向对象


感谢IT牛人博客聚合上还能找到我之前博客的一些内容,因为之前主机没续费等各种原因,也懒得翻之前的备份文档了,就把那上面的文章直接拷过来整理一下好了,只搬迁一些还有意义的内容好了,其他的就让它随风而去吧。

继承和多态可以算是面向对象设计的两个最基本的概念了,而这两种技术的实现离不开接口和抽象类。曾经面试的时候被问过这样一个问题,就是Java的接口和抽象类有什么区别。不想谈太多语法上的区别,只想说说它们语义上的区别。接口,是用来描述类的抽象行为的;而抽象类更多是描述一个物种的某些共同属性的。从这个意义上讲,一个具体的事物是不可能既属于A物种又属于B物种的,所以Java中不允许多重继承,但是因为即便是不同物种也可以拥有相同行为,因此从接口上可以“多重实现”,但是因为物种不同,所以这个行为的表现上也是不同的,因此虽然行为是相同的,但是你得根据不同物种去不同实现。

根据Java的世界观,这个世界上有了生物接口,有一些共同的行为,比如吃饭、睡觉、打豆豆什么的,但不同种类的生物吃饭、睡觉、打豆豆的方式不一样,慢慢的生物出现了各种物种,比如人类和鸟类。但人类因为地域的不同相同的行为有衍生出不同的行为方式,所以人类只能算是抽象类,定义人有四肢有两个眼睛一个鼻子一个嘴。然后又具体有亚洲人、欧洲人、美洲人、非洲人等等,他们的行为方式是不同的。比如中国人吃饭用筷子,欧美人则用刀叉等等。

本来以为世界就此安静了,很可惜随着科学的进步,人兽杂交成为了可能,于是诞生了新的物种——鸟人。本来既然鸟人是新的物种,理所当然它应该实现生物接口,然后定义一个抽象的鸟人。但问题来了,我们有欧洲鸟人、亚洲鸟人、非洲鸟人、美洲鸟人,他们除了会飞其他行为和人类是一样的。但是碍于鸟人和人类是不同物种,你不得不重复实现人类所具有的功能,然后让他们再加上鸟人会飞的功能。或者说在鸟人体内安装一个人类代理,当需要进行人类动作时,就用这个人类代理去完成。

问题虽然能够解决,但是不够Clean。但是没办法,在这样一个世界观里,你能做到的就只有这些。不得不说说Scala的trait,特征,听着就让人激动。如果我们的世界观里有了特征,那么会飞只是一个特征而已,鸟的飞和鸟人的飞从本质上说是一样的,所以给欧洲人混入飞的特征那么他就成了欧洲鸟人,给亚洲人混入会飞的特征那么他就成了亚洲鸟人……更令人激动的是,即使不能形成鸟人这个物种,我们只有一个会飞的日本鸟人,我们只要给他插上翅膀,他就从一个日本人变成了一个日本鸟人!当然,此时日本人还是日本人,只有某人变成了日本鸟人。

抽象的行为固然是好的,但是很多时候我们也同样需要具体的特征,就像七巧板可以拼出不同的图形一样。可惜,世界观是一早就形成的,如果在接口和抽象类行为不变的情况下引入特征,那么势必会让很多程序员感到困惑。今天的闲扯就到这里,完全是因为工作中遇到了一些想使用多重继承但是碍于世界观又不得不使用copy代码的方式的问题。


文章作者: Odin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Odin !
  目录