Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在几个类中重构公共代码的最佳方法?_C#_Asp.net - Fatal编程技术网

C# 在几个类中重构公共代码的最佳方法?

C# 在几个类中重构公共代码的最佳方法?,c#,asp.net,C#,Asp.net,我正在尝试清理一些代码,我看到有三个类,除了这三个类之外,其他三个类都是相同的,其中一些类的属性比其他的多,并且需要比其他两个保存更多或更少的属性 我有点像 //class 1 public class GenerateQKey { public void DoSomething() { //this one uses a specific class with some parameters var KeySet = new Ge

我正在尝试清理一些代码,我看到有三个类,除了这三个类之外,其他三个类都是相同的,其中一些类的属性比其他的多,并且需要比其他两个保存更多或更少的属性

我有点像

//class 1
public class GenerateQKey
{
      public void DoSomething()
      {
          //this one uses a specific class with some parameters
          var KeySet = new GenerateQSetOfK()
              {
                   KeyName = "some key";
                   KeyChain = "Some key chain";
                   KeyManufacturer = "Manufacturer";
              }

           someCall.Save(KeySet);
      }
}
然后我还有一个:

//class 2
public class GenerateDifferentKey
{
      public void DoSomething()
      {
          //this one uses a specific class with some parameters + more
          var KeySet = new GenerateDifferenKey()
              {
                   Name = "some key";
                   Chain = "Some key chain";
                   Manufacturer= "Manufacturer";
                   Price = 3.00m;
              }

           someOtherCall.Save(KeySet);
      }
}
还有另一个相同的原则。。他们都在做基本相同的事情,只是使用不同的API并保存到不同的地方。我想以一种非常好的方式重构它,但我不确定它会是什么

可能有一个manager类,它接收GenerateQKey或GenerateDifferentKey,并在确定键的类型后调用特定的api,但是参数呢?我应该创建一个基类吗


我正在努力成为一名更好的开发人员,您的投入将真正有助于实现这一目标。

对我来说,这听起来像是可以解决的问题

模板方法的步骤在所有子类之间都是相似的,用于“使用不同API”和“保存到不同位置”的方法是抽象方法,每个子类将以不同的方式实现

public abstract class SharedClass
{
   abstract CallApi();
   abstract Save();

   public void MyTemplateMethod()
   {
     // shared steps...

     // Call abstract templated method
     this.CallApi();

     // more shared steps...

     // Call abstract templated method
     this.Save(); 
   }
}

public class ChildClass1 : SharedClass
{
  public void CallApi()
  {
     // I use API #1
  }

  public void Save()
  {
    // I save by doing it way #1
  }
}

public class ChildClass2 : SharedClass
{
  public void CallApi()
  {
     // I use API #2
  }

  public void Save()
  {
    // I save by doing it way #2
  }
}

你可以用它来清理,但作为一个警告,它可能会变得一团糟。看看
我看到有三个类,除了这三个类之外,其他三个类都是相同的,其中一些类的属性比其他两个多,需要保存的属性比其他两个多或少。
抱歉什么?我认为OP表示有三个类具有相同的用途,但是类a的属性是
foo
,B类具有属性
foo
bar
,C类具有属性
foo
bar
baz
。另一种选择是使用超类,只分配所需的值。只是在读取属性时要非常小心,如果它们没有分配给您,您将得到一个对象引用错误。