【发布时间】:2019-02-17 14:58:13
【问题描述】:
例如,我有以下课程:
1.
class MyClass1
{
public MyClass1 Method()
{
...
return new MyClass1();
}
}
class MyClass2
{
public MyClass2 Method()
{
...
return new MyClass2();
}
}
这些方法具有相同的主体,这就是我要提取代码并重用的原因。
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();
}
}
但是,由于有很多这样的方法,最好将这些方法移到基类 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();
}
它工作正常,但合同看起来太奇怪了。当然,我可以提取 IMyInterface 之类的内容并返回它而不是类。但是我必须保留原始合同,因为它也包含特定的方法。
更新:所以,奇怪的是粗体 - class MyClass1: MyClassMyClass1>
【问题讨论】:
-
“但是我必须保留原来的合同” 你是什么意思?
-
Foo : Thing<Foo>是一种相当常见的模式,Thing<T>需要返回其子类的实例。我不会担心的。