簡體   English   中英

具有抽象基類的C#運行時多態

[英]c# runtime polymorphism with abstract base class

我正在嘗試清理現有的代碼庫,並且在對抽象類的不同派生類使用通用引用名稱時遇到麻煩。

例如:

public abstract class Base<T> : Utilities.CommonRequiredObject
{
    protected List<T> RawContents = new List<T>();
    .
    .

    public abstract void LoadContents(List<T> Contents);        // Each Class needs to load and process differently
    protected List<T> Contents;

    public virtual void DoSomething()           // Default here for common use. Defined in Each class for its specifics (if needed)
    {
    ...
    }
    public abstract List<T> FunctionToGetContents();

}

public class FOO : Base<string>
{
    public override void DoSomething() ...
    public override List<string> FunctionToGetContents() ...
}

public class BAR : Base<byte>
{
    public override void DoSomething() ...
    public override List<byte> FunctionToGetContents() ...
}

嘗試使用公共變量的主邏輯。 我想創建一個新類以供使用,但是想以運行時多態的方式使用它。 由於這些類具有通用功能,並且在需要的地方具有覆蓋,因此我希望能夠創建一個實例,然后使用它:

IE: Base<T> ObjectToUse;

這樣,我可以簡單地在以下代碼中引用ObjectToUse並調用通用方法。 當我從另一個基類繼承了一些通用例程時,我不確定是否可以使用接口。

if(variable)
{
    FOO ObjectToUse = new FOO();
}
else
{
    BAR ObjectToUse = new BAR();
}

ObjectToUse.LoadContents(ObjectToUse.FunctionToGetContents());
ObjectToUse.DoSomething();
...

編輯:基於我很快收到的評論(再次感謝大家),這將比刪除泛型( Base<T> )並使類全部為Base()更好,然后我可以將ObjectToUse定義為Base ObjectToUse; 我相信。

無法做到這一點。

通過利用需要通用類型參數的引用,您必須給它一個。 您可以在此處利用dynamic ,以便對類型進行運行時評估,但這就是您所能得到的最好的結果。

即使利用模板方法模式之類的東西,也需要指定泛型類型參數。 如果您只想使用DoSomething方法,則需要將其提升為更高的基類(或接口),以便您可以持有對該類型的引用,並調用該(非泛型)函數。

就您的評論,我要采取的解決方案是: 將公共代碼重構為基類中的模板方法模式。 然后,使“觸發”功能成為非通用基類(或接口)的非通用繼承成員。 現在,您可以保留對該類型的引用,並調用模板方法以引起其他調用。

public void DoAwesomeStuff() //inherited from non-generic parent or interface
{
   LoadContents(FunctionToGetContents());
   DoSomething();
}

然后:

IDoesAwesomeStuff ObjectToUse = new FOO();
ObjectToUse.DoAwesomeStuff();

暫無
暫無

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

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