继承具备以下优势:实现新的类很是容易,由于基类的大部分功能均可以经过继承关系自动赋予派生类;修改或者扩展继承来的实现很是容易;只要修改父类,派生的类的行为就同时被修改了。web
初学面向对象编程的人会认为继承真是一个好东西,是实现复用的最好手段。可是随着应用的深刻就会发现继承有不少缺点:继承破坏封装性。基类的不少内部细节都是对派生类可见的,所以这种复用是“白箱复用”;若是基类的实现发生改变,那么派生类的实现也将随之改变。这样就致使了子类行为的不可预知性;从基类继承来的实现是没法在运行期动态改变的,所以下降了应用的灵活性。
继承关系有不少缺点,若是合理使用组合则能够有效的避免这些缺点,使用组合关系将系统对变化的适应力从静态提高到动态,并且因为组合将已有对象组合到了新对象中,所以新对象能够调用已有对象的功能。因为组合关系中各个各个对象的内部实现是隐藏的,咱们只能经过接口调用,所以咱们彻底能够在运行期用实现了一样接口的另一个对象来代替原对象,从而灵活实现运行期的行为控制。并且使用合成关系有助于保持每一个类的职责的单一性,这样类的层次体系以及类的规模都不太可能增加为不可控制的庞然大物。所以咱们优先使用组合而不是继承。
固然这并非说继承是很差的,咱们可用的类老是不够丰富,而使用继承复用来建立一些实用的类将会不组合来的更快,所以在系统中合理的搭配使用继承和组合将会使你的系统强大而又牢固。