我创建了一些类如下:
abstract class TestBase<T, TThis> where TThis : TestBase<T, TThis>, new()
{
public T Thing { get; set; }
public static TThis CreateNew(T t)
{
return new TThis {Thing = t};
}
}
abstract class MiddleClass : TestBase<string, MiddleClass>
{
public abstract void DoSomething();
}
class RealClass : MiddleClass
{
public override void DoSomething()
{
// do something
}
}
...
var mc = RealClass.CreateNew("Hello world");
mc.DoSomething();
正如您所看到的,使用此模式我可以模拟静态方法CreateNew()
的一种继承,它返回调用的TestBase
子类的类型。适用于源自TestBase
。
麻烦的是,在这种特殊情况下它不会编译,因为MiddleClass
是抽象的,因此没有无参数构造函数来满足new()
约束。
除了让MiddleClass
具体化之外,你能想到一个解决方法吗?
答案 0 :(得分:1)
你也可以MiddleClass
通用:
abstract class MiddleClass<T> : TestBase<string, T> where T : MiddleClass<T>, new()
{
public abstract void DoSomething();
}
然后RealClass
定义为:
class RealClass : MiddleClass<RealClass>
{
public override void DoSomething()
{
// do something
}
}
答案 1 :(得分:1)
让你的中产阶级通用
abstract class TestBase<T, TThis> where TThis : TestBase<T, TThis>, new()
{
public T Thing { get; set; }
public static TThis CreateNew(T t)
{
return new TThis { Thing = t };
}
}
abstract class MiddleClass<TThis>
: TestBase<string, TThis> where TThis : TestBase<string, TThis>, new()
{
public abstract void DoSomething();
}
class RealClass : MiddleClass<RealClass>
{
public override void DoSomething()
{
// do something
}
}