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。
希望我的回答对您有帮助。
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |