Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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#_Interface_Refactoring_Abstract Class - Fatal编程技术网

C# 用非常相似的方法重构两个类的最佳方法是什么?

C# 用非常相似的方法重构两个类的最佳方法是什么?,c#,interface,refactoring,abstract-class,C#,Interface,Refactoring,Abstract Class,我有两个独立的类,它们都包含相同的方法名(start、validation等) 但是,两个类之间方法所期望的参数是不同的 例如。。。我有类似的想法: public static class A { public static void Start(string a, string b) ...implementation inside of it public static void Validate (string a, FileInfo b) ...implementati

我有两个独立的类,它们都包含相同的方法名(start、validation等)

但是,两个类之间方法所期望的参数是不同的

例如。。。我有类似的想法:

public static class A
{
    public static void Start(string a, string b) ...implementation inside of it

    public static void Validate (string a, FileInfo b) ...implementation inside of it
}


public static class B
{
     public static void Start (string a) ...implementation inside of it

     public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it
}
有没有办法从设计角度用更好的代码来重构它?这两种方法也共享一些公共代码

我试图创建一个接口(我必须从两个类中删除静态),但最终它是一个混乱,因为我必须实现类a和B中的4个方法中的每一个,这不是我想要的


如果我能对此有所了解,那就太好了。我需要一个接口吗?也许是抽象类?还有其他事情吗?

我认为,有一种更简单的方法。类都是从静态开始的,您需要的是基于接口或基于继承的解决方案。更简单的方法是在单个类中重载方法

这意味着您将把这些方法折叠成一个静态类,该类将具有多个重载方法。这将使重构变得更简单,并允许您在“统一”类中更容易地重用公共代码

比如说:

public static class AB // combined
{
    public static void Start(string a, string b) ...implementation inside of it

    public static void Validate (string a, FileInfo b) ...implementation inside of it

    public static void Start (string a) ...implementation inside of it

    public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it

    private static string SomeCommonFunctionality(string a, string h) ...implementation
}

使用可选参数。这取决于您的代码在做什么,以及这是否是一个可行的解决方案

public static class B
{
     public static void Start (string a, string b = string.empty)
     {
          //common code
          if (b != string.empty)
          {
              var s = SomethingSpecific(string y)
          }
          //common code
     }
     public static void Validate(string a, string h FileInfo b, string[] c = null)
     {

     }

     private static string SomethingSpecific(string y)
     {
          //Do some custom logic here
     }
}

在这种情况下,我将把Validate函数的输入参数分组到一个新类中

public static class Params {
    public string a,
    public FileInfo b
}
然后将这个类扩展到

public static class ExtendedParams extends Params {
    public string h,
    public string[] c
}
然后我原来的A,B类可以使用相同的接口

interface iAB {
    public Start(string a, string b)
    public Validate(Params c)
}
每个类的启动和验证方式都不同,但类B希望将ExtentedParams作为输入,因此您必须将其强制转换为ExtendedParams才能访问额外的字段

如果需要更干净的方法,根据对象的语义,Params对象应该公开一个包含要对其执行的操作(或其数据)的接口,并让它们处理逻辑。例如(基于上一个示例):


最后,这实际上取决于系统中您自己的逻辑,但这就是我将遵循的方向。

要回答这个问题,我们需要更多关于类在语义上应该做什么的信息。也许有办法使参数相等;也许功能的某些部分可以提取到另一个类中。视情况而定。我同意@valenterry:我不会仅仅根据您提供的信息进行重构。从表面上看,这两个类只有通过名称相同但参数不同的方法才有关联!这两种方法可能互不相关。它们的任何共同点都将是如何实施的问题。我可能会重构实现,但我不会重构公共接口。
public static class Params {
    public string a,
    public FileInfo b,
    public void validate()
}

public static class ExtendedParams extends Params {
    public string h,
    public string[] c,
    public void validate()   // implements its own validation
}