组合和继承是允许在新建的类中放入子对象,组合是显示的这样做的,而继承是隐式的做。二者是之间有何区别?或者怎样在二者之间做出选择呢?下面就一起来看看,
组合一般是将现有的类型作为新类型底层实现的一部分来加以复用,在一个类中引用另一个类,而继承是拥有了父类的非私有方法。其中“is-a (是一个)”的关系是用继承来表达的,而“has-a(有一个)”的关系则是用组合来表达的。
组合关系和继承关系相比,前者的最主要优势是不会破坏封装,在软件开发阶段,组合关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于组合关系使系统具有较好的松耦合性,因此使得系统更加容易维护。组合关系的缺点是比继承关系要创建更多的对象。从软件构架来说,组合,耦合度比继承弱,继承是对父类方法和数据成员的兼收并蓄,而组合,可以有选择得使用某一种方法。
下面来看一个组合的案例:
public class Engine {
public void start(){System.out.println("启动汽车引擎");}
public void rev(){System.out.println("重启汽车引擎");}
public void stop(){System.out.println("关闭汽车引擎");}
}
public class Wheel {
public void inflate(int psi){System.out.println("为轮胎打气");}
}
public class Window {
public void rollup(){System.out.println("向上关窗");}
public void rolldown(){System.out.println("向下开窗");}
}
public class Door {
private Window window = new Window();
public void open(){System.out.println("打开车门");}
public void close(){System.out.println("关闭车门");}
public Window getWindow() {
return window;
}
public void setWindow(Window window) {
this.window = window;
}
}
public class Car {
private Engine engine = new Engine();
private Wheel[] wheel = new Wheel[4];
private Door left = new Door(),right = new Door();
public Car(){
for (int i = 0; i < 4; i++) {
wheel[i] = new Wheel();
}
}
public static void main(String[] args) {
Car car = new Car();
car.wheel[0].inflate(72);
car.left.getWindow().rollup();
car.engine.start();
car.engine.stop();
car.right.open();
car.right.close();
}
}
运行结果:
为轮胎打气
向上关窗
启动汽车引擎
关闭汽车引擎
打开车门
关闭车门
理解组合和继承之间的区别了,那怎样在他们之间做出选择呢?
选择组合方式还是集成方式的一个清晰的办法就是看看是否需要在新类上向基类进行向上转型。如果必须进行向上转型,则继承是必要的;但是如果不需要,则应该好好考虑一下自己是否真的需要继承。