自引用的通用参数

Ser*_*046 9 .net c# generics typing

例如,我有以下类:

1.

class MyClass1
{
    public MyClass1 Method()
    {
        ...
        return new MyClass1();
    }
}

class MyClass2
{
    public MyClass2 Method()
    {
        ...
        return new MyClass2();
    }
}
Run Code Online (Sandbox Code Playgroud)

这些方法具有相同的主体,这就是我想要提取代码并重复使用的原因.

2.

abstract class MyClass
{

    protected void Method()
    {
        ...
    }
}

class MyClass1 : MyClass
{

    public MyClass1 Method()
    {
        base.Method();
        return new MyClass1();
    }
}

class MyClass2 : MyClass
{
    public MyClass2 Method()
    {
        base.Method();
        return new MyClass2();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于有很多这样的方法,最好将方法移动到基类MyClass中:

3.

abstract class MyClass<T>: where T : MyClass<T>
{
    protected abstract T Create();

    public T Method()
    {
        ...
        return Create();
    }
}

class MyClass1 : MyClass<MyClass1>
{
    protected override MyClass1 Create() => new MyClass1();
}

class MyClass2 : MyClass<MyClass2>
{
    protected override MyClass2 Create() => new MyClass2();
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但合同看起来太奇怪了.当然,我可以提取类似的东西,IMyInterface然后返回它而不是类.但是我必须保留原始合同,因为它也包含特定方法.

Upd:所以,奇怪的是大胆的类MyClass1:MyClass < MyClass1 >

小智 3

是的,有一个只创建的方法看起来有点奇怪。

因为你有 2 个类 MyClass1 和 MyClass2,它们有特定的不同方法,并且只有基本方法是通用的(你将其放入基类中),我认为你可以使用抽象工厂模式。

public class ClassFactory: IClassFactory
{
    public MyClass Create()
    {
         if (some condition)
              return new MyClass1;
         return new MyClass2;
    }
}

class MyClass
{
    protected string CommonLogic()
    {
         //common logic 
         return string;
    }

}

class MyClass1 : MyClass
{
    public object SpecificMethod()
    {
        CommonLogic();
        .....
    }

}

class MyClass2 : MyClass
{
    public object SpecificMethod2()
    {
        CommonLogic();
        .....
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不会有重复的代码,并且您将拥有一些类,该类将负责创建您的类,并且知道何时以及哪个类返回。+ 您将在这里轻松使用 IoC。

希望我的回答对您有帮助。

  • 铸件?不,谢谢。我的选择#2、#3 和你原来的建议更好。 (3认同)
  • 它有何帮助?我的#2 和你的建议有什么区别?无论如何,感谢您的时间和尝试。 (2认同)