如何解决此代码重复+添加另一种方法

我有3个class:

class First { public void SetA(){ ... } public void SetB(){ ... } public void SetC(){ ... } public void SetD(){ ... } public void SetZ(){ ... } } class Second { public void SetC(){ ... } public void SetD(){ ... } public void SetE(){ ... } public void SetF(){ ... } public void SetX(){ ... } } class Third{ public void SetA(){ ... } public void SetB(){ ... } public void SetE(){ ... } public void SetF(){ ... } public void SetY(){ ... } } 

如您所见,我使用相同的方法复制代码。
昨天我意识到有时候我想在每个方法中添加另一个推荐。
所以我正在寻找解决这两个问题的方法。 我想到的一个解决方案是:

  1. 创建界面:

     interface IAllMethods { void SetA(); void SetB(); void SetC(); void SetD(); void SetE(); void SetF(); void SetX(); void SetY(); void SetZ(); } 
  2. 创建默认实现:

     class DefaultAllMethods { public void SetA(){ ... } public void SetB(){ ... } public void SetC(){ ... } public void SetD(){ ... } public void SetE(){ ... } public void SetF(){ ... } public void SetX(){ ... } public void SetY(){ ... } public void SetZ(){ ... } } 
  3. 使用装饰器模式创建另一个实现,以添加额外的命令:

     class ExtraAllMethods { private IAllMethods _allMethods; public ExtraAllMethods (IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); extraMethod(); } public void SetB(){ _allMethods.SetB(); extraMethod(); } public void SetC(){ _allMethods.SetC(); extraMethod(); } .. .. .. } 
  4. 在First,Second和Third类中使用欲望实现。 例如:

     class Third{ private IAllMethods _allMethods; public Third(IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); } public void SetB(){ _allMethods.SetB(); } .. .. .. } 

您对此解决方案有何看法? 这个需求有更好的设计吗?

UPDATE
人们要求真正的业务,所以这就是:我有3种类型的传输:TransmissionA,TransmissionB,TransmissionC每个传输都有许多参数(成员或属性)。 例如,TransmissionA具有WorkerId,CustomerId,MessageName等。 TransmissionB具有WorkerId和MessageName但没有CustomerId。 TransmissionC具有WorkerId,CustomerId但没有MessageName。 这些仅是示例 – 在我的情况下,我为每次传输提供了更多属性。 每个属性都有Set方法。
现在有了新的需求。 在系统的某个地方有一个名为“更新任务”的选项。 如果该选项为ON,那么我需要更新每个Set方法中的相关任务。 这就是为什么我想到装饰模式。

这将有效但不是引入包含所有方法的全知的接口和基本实现类(因此了解整个方法集合),您还可以采用更细粒度的方法,只需创建单个接口和基础实现对于每种方法。 这将更具可扩展性,如果你正确设置它,你可以像插件一样简单地附加那些。

  1. 接口并不是一个好主意,因为它的实现者只为接口提供的方法的子集提供function。
  2. 这里不能使用装饰器模式 ,因为它用于添加function,它不能像添加方法那样用于更改API。 有关详细信息,请参阅此答案 。
  3. 如果在不同的类中使用相同的代码具有相同的方法,则应将其提取到自己的类中并由其他类使用。 目前,您的课程很可能违反单一责任原则 。

您可以为每个单独的方法和每个接口的默认实现定义一个接口,并使您的类只实现所需的接口,并通过构造函数进行参数化,并使用默认实现进行装饰。

取决于这些方法正在做什么,所以解决方案可能会有所不同。 但是,如果这些方法在某种程度上并没有以某种方式绑定,我会建议通过类似的接口来抽象每个方法

  interface ILogicBAware { void DoB(); } interface ILogicCAware { void DoC(); } interface IAllMethods : ILogicBAware, ILogicCAware { void DoAll(); } 

这样,您可以获得更大的灵活性和更少的耦合。 通过这种方式,您可以继续前进并决定如何封装实际逻辑。 但这又取决于你提供的课程和方法的内幕……