[英]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.