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 : 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コンクリートを作る以外に、これに対する回避策を考えられますか?

4

2 に答える 2

3

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
    }
}
于 2013-10-13T10:58:33.217 に答える