java继承与组合与代理

来源:互联网 发布:股指期货持仓数据 编辑:程序博客网 时间:2024/05/17 04:58
        所有的程序语言,都要想办法解决代码复用性的问题,在java中,可以通过继承或者组合或者代理复用代码。这里解释一下继承和组合的区别,以及他们分别适应于什么场景,以及使用时候应该注意什么。

        子类通过继承,可以直接拥有父类的所有方法(接口)和属性(域);组合,通过将其他类作为自己的成员变量,也拥有了这个类的所有方法(接口)和属性(域)。他们都可以复用代码。如下代码所示:

继承
class Base{public void test(){System.out.println("test");} }public class Super extends Base{}
子类通过继承父类,拥有了父类的所有的方法。

组合
class Base{public void test(){System.out.println("test");} }public class Super{Base b;}
Super通过将Base作为自己的成员变量,也拥有了Base中的所有方法。

其实呢,继承可以认为是子类拥有一个父类对象,但是这个对象在子类的内部;而组合是其中的一个对象是在外部的。继承中,父类通常是一个通用的类,而子类是父类的特殊化。我们可以简单的认为,继承是is-a的关系,比如,鸟是父类而麻雀是子类;组合是has-a的关系,比如,车和轮子的关系。

继承通常会将自己的方法,设置为public,方便子类的使用;组合通常将会对象引用设置为private,因为通常只是希望自己能够访问此成员的内部属性,并不希望对象用户可以访问。

另外需要注意的是,虽然继承是一个相当重要的概念,但是在实际的运用中,一定要注意,尽量不要轻易的去使用继承这个概念。
使用继承时,必须是自己清楚的认识到,确实需要对一个抽象,进行特殊化,并且确实要用到向上转型(多态中的概念),否则尽量不要使用。


我们还可以使用代理来作为中庸之道,作为继承和组合的中间。
看如下代码:
代理
class SpaceControll{void up(int num){}void down(int num){}void left(int num){}void right(int num){}}class Space{private SpaceControll s = new SpaceControll();void up(int num){s.up( num);}void down(int num){s.down( num);}void left(int num){s.left( num);}void right(int num){s.right( num);}}

显示,飞船控制,不应该由飞船类来继承,实际上,飞船控制,应该是飞船所拥有。在这种情况下可以使用代理,通过代理,表面上通过飞船调用,而在底层还是通过飞船控制类。我们使用代理还可以增强控制力。比如不一定把飞船控制的所有功能都暴露出来,而是选择自己需要的暴露。



      



原创粉丝点击