我有一个实现许多功能的A类.A级非常稳定.
现在我有一个新的功能要求,其中一些功能与A实现的功能匹配.我不能直接从A类继承我的新类,因为这会给我的新类带来很多冗余.
那么,我应该在两个类中复制公共代码吗?
或者,我应该创建一个新的基类并将公共代码移动到基类,并从中派生出A类和新类?但这会导致我现有课程的变化.
那么,哪种方法更好?
除非有一个很好的理由不修改A类,重构并建立一个共同的基础(甚至更好,一个既可以使用但又不一定来自的公共类).
您始终可以使用私有继承来访问共享功能,而无需修改类作为外部接口 - 此更改将需要重建,但仅此而已.将所有函数保留在A类中,并将它们转发到共享实现类.
您可能不想重构,而是复制代码的一个原因是,新类的功能可能会发生变化,但旧类中不需要进行相同的更改.不复制代码的原因之一是只需要在一个地方进行修复或更改.如果要发生会破坏原始类的更改,那么您可能希望复制代码.虽然在大多数情况下,只有当这两个类没有您想象的相似时才会发生这种情况,并且您将努力尝试抽象一组通用功能.
(1)除非您或您的雇主准备无限期地保留两份副本,否则不要在两个类别中复制共同代码.
(2)按定义重构会更改您已有的类.您建议的重构称为"Extract SuperClass",后跟"Pull Up Method",用于派生类通用的每个方法.这是一个很好的方法.
编辑:我记得Refactoring背后的真正宝石:在合理的范围内,它是完美的流畅和可逆的.从来没有一个"权利"只有一个"现在的权利".如果您稍后决定对这些类使用继承不是一个好的对象模型,那么您可以再次重构以使用组合(正如Josh所建议的那样).