簡體   English   中英

繼承需要構造函數的泛型類型的抽象類

[英]Abstract class inheriting a generic type requiring a constructor

我創建了一些類如下:

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具體化之外,你能想到一個解決方法嗎?

你也可以使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
    }
}

只需讓你的中產階級通用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM