实现IKitchenObjectParent接口时如何避免代码重复?
解决方案:用组合模式复用接口实现
由于C#不支持多重继承,且你的场景里继承会带来不必要的耦合,组合是更合适的选择,具体实现步骤如下:
1. 抽离重复实现到独立类
把Implementation A的逻辑封装到一个单独的工具类里,若需要访问宿主对象的成员,可通过构造函数传入引用:
public class KitchenObjectParentImplA { // 若需访问宿主的属性/方法,可保留宿主引用 // private readonly IKitchenObjectParent _host; // public KitchenObjectParentImplA(IKitchenObjectParent host) // { // _host = host; // } public void DoParentStuff() { // 这里放 IMPLEMENTATION A 的具体代码 } }
2. 在需要复用的类中通过组合调用实现
修改Player类:
public class Player: IKitchenObjectParent { private readonly KitchenObjectParentImplA _impl = new KitchenObjectParentImplA(); public void DoParentStuff() { _impl.DoParentStuff(); } }
修改CuttingCounter类:
public class CuttingCounter : BaseCounter, IKitchenObjectParent { private readonly KitchenObjectParentImplA _impl = new KitchenObjectParentImplA(); public void DoParentStuff() { _impl.DoParentStuff(); } }
3. 针对不同实现的扩展
对于DeliveryCounter的Implementation B,可以用同样的方式抽离,保持代码一致性:
public class KitchenObjectParentImplB { public void DoParentStuff() { // 这里放 IMPLEMENTATION B 的具体代码 } } public class DeliveryCounter : BaseCounter, IKitchenObjectParent { private readonly KitchenObjectParentImplB _impl = new KitchenObjectParentImplB(); public void DoParentStuff() { _impl.DoParentStuff(); } }
方案优势
- 避免不必要的继承耦合:无需修改
BaseCounter的继承关系,也不会强迫不需要实现接口的子类继承额外类。 - 复用更灵活:同一个实现类可以被任意类组合使用,不受继承树限制。
- 符合「组合优于继承」的面向对象原则,代码更易维护和扩展——后续修改
Implementation A只需调整KitchenObjectParentImplA,所有复用它的类都会自动生效。
内容的提问来源于stack exchange,提问作者Rafael Santiago Altoé
相关产品推荐
相关产品推荐

