使用继承作为重用代码的方法有什么缺点?

ing*_*lor 4 inheritance code-reuse

使用继承作为重用代码的方法有什么缺点?

sta*_*ica 6

IIRC,Liskov替代原则 1)假定一个人应该能够用任何派生类替换一个类; 也就是说,派生类的行为不应与其基类的行为完全不同,或违反它们的基类设置的合同.

显然,这个原则对一个(基类)类如何被另一个类(从它派生)"重用"有意限.其他使用类的方法,例如聚合或组合,因此不受该原理的限制.


1)参见例如Liskov替代原则(链接到PDF文档).


Fre*_*abe 6

使用继承来实现代码重用会遇到以下问题:

  1. 您无法在运行时更改重用的行为.继承是一个编译时依赖项,因此如果一个GameClient类继承TCPSocket来重用connect()write()成员函数,它就具有硬编码的TCP功能.您无法在运行时更改此设置.

  2. 为了进行测试,您无法从外部替换重用的行为.如果一个GameClient类继承TCPSocket而得到write()(用于将数据写入套接字),则无法从外部交换此代码.您无法插入另一个write()函数,该函数会记录GameClient要写入文件的所有数据.

  3. 除了最简单的应用程序之外,您依赖于多重继承.这为钻石形状的继承树打开了大门,这大大增加了代码的复杂性.

优先考虑继承的组合以重用代码可以避免所有这些问题.