java继承与组合与代理

        所有的程序语言,都要想办法解决代码复用性的问题,在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);
	}
	
}

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



      



你可能感兴趣的:(java编程语言深入剖析)