C# 如何解决这种代码重复+;添加另一种方法

C# 如何解决这种代码重复+;添加另一种方法,c#,.net,design-patterns,architecture,C#,.net,Design Patterns,Architecture,我有三门课: 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(){ ... }

我有三门课:

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(){ ... }
}
如您所见,我使用相同的方法复制代码。
昨天我意识到有时我想在每个方法中添加另一个推荐。
因此,我正在寻找解决这两个问题的方法。我想到的一个解决方案是:

  • 创建接口:

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

    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(){ ... }
    }
    
  • 使用decorator模式创建另一个实现,以便添加额外的命令:

    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();
            }
            ..
            ..
            ..
    }
    
  • 在类First、Second和Third中使用desire实现。例如:

    class Third{
        private IAllMethods  _allMethods;
        public Third(IAllMethods allMethods) {
            _allMethods=allMethods;
        }
        public void SetA(){ _allMethods.SetA(); }
        public void SetB(){ _allMethods.SetB(); }
        ..
        ..
        ..
    }
    
  • 你觉得这个解决方案怎么样?有没有更好的设计来满足这一需求

    更新
    人们要求的是真正的生意,所以这里是: 我有三种变速器:变速器A、变速器B、变速器C 每个传输都有许多参数(成员或属性)。例如,TransmissionA有WorkerId、CustomerId、MessageName等。TransmissionB有WorkerId和MessageName,但没有CustomerId。TransmissionC有WorkerId、CustomerId,但没有MessageName。这些只是示例-在我的情况下,每个传输都有更多的属性。每个属性都有Set方法。
    现在有了新的需求。在系统的某个地方有一个名为“更新任务”的选项。如果该选项处于启用状态,则我需要更新每个集合方法中的相关任务。这就是为什么我想到了装饰图案

  • 接口不是一个好主意,因为它的实现者只为接口提供的方法子集提供功能
  • 此处不能使用,因为它用于添加功能,不能像添加方法那样用于更改API。有关更多信息,请参阅
  • 如果在不同的类中有相同的方法和相同的代码,那么应该将其提取到自己的类中,并由其他类使用。目前,您的类很可能违反了

  • 这取决于这些方法在做什么,因此解决方案可能会有所不同。 但是,如果这些方法不以某种逻辑方式相互关联,我建议通过一个接口抽象每个方法,如

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

    通过这种方式,您可以获得更大的灵活性和更少的耦合。通过这种方式,您可以前进并决定如何封装实际逻辑。但这同样取决于您提供的类和方法的保护之下是什么…

    这将起作用,但不会引入包含所有方法的全知接口和基本实现类(从而了解所有方法集合)您还可以采用更细粒度的方法,只为每个方法创建一个接口和基本实现。这将更具可扩展性,如果设置得当,您可以以类似插件的方式轻松地附加它们。

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

    为什么要使用方法而不是设置属性?只需用方法声明一个抽象类并继承该类即可。然后,您可以简单地重写该方法。如果类不使用它,则不要对其进行clall或重写。这些类实际上是可互换的吗?换句话说,它是否像狗和猫一样,虽然不同,但既能行走又能咬人?我试图确切地了解它们是做什么的,以及它们之间的关系。@Armen Tsirunyan-我认为这些方法确实起到了作用。我同意这是一个糟糕的设计。如果你解释一下你在解决什么问题,而不是给出一个抽象概念,然后问“如何使它更抽象”,这会有所帮助。它让我们有助于跳出框框思考。你怎么能想象没有多重继承的每个方法的基本实现?@mtijn:你的意思是我应该添加9个接口和实现(在本例中)?是和否,我想到的是9个接口和9个类的具体实现,我想到的是你的第一个,第二类和第三类通过调用具有实际接口实现的类来实现所需的接口。您希望第一、第二和第三个插件通过继承或保留受支持插件的公共集合来显式公开其功能,这取决于您。1。这里的接口用于装饰器。2.我使用decorator是为了在每个方法中添加额外的命令(比如logging命令),而不是为了添加方法。3.在这个示例中,您能告诉我如何将类提取到一个类中吗?4.其他类中的相同方法之间没有关系。@Naor:正如其他人已经指出的:您的“示例代码”没有多大用处,因为它是抽象的。如果在不同的类中有相同的代码,这是一个设计缺陷。如何解决它取决于实际的代码库。关于您的答案:装饰者应该实现与装饰对象相同的接口,即
    第一个
    第二个
    第三个
    应该实现
    IALMethods
    。这直接表明接口是“错误的”,因为这三个类都没有提供接口的所有方法。这也取消了您所展示的decorator方法的资格。@Naor:若要获得非理论性的答案,请提供实际的代码。我知道存在一个差距-第一、第二和第三种方法不会实现IALMethods。我在寻找更好的方法。例如,其他人建议为每个属性创建一个接口。请看我添加的更新。