继承需要构造函数的泛型类型的抽象类

时间:2013-10-13 10:54:34

标签: c# generics inheritance

我创建了一些类如下:

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具体化之外,你能想到一个解决方法吗?

2 个答案:

答案 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
        }
    }