我正在尝试清理现有的代码库,并且在使用通用引用名称到抽象类的不同派生类时遇到了问题。
例如:
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();
...
编辑:
基于我收到的评论很快(再次感谢所有人),最好是删除Generic(Base<T>
)并让类全部为Base(),然后我可以简单地定义ObjectToUse
作为Base ObjectToUse;
我相信。
答案 0 :(得分:4)
这不可能。
通过使用需要泛型类型参数的引用,您必须给它一个。您可以在此处使用dynamic
,以便对类型进行运行时评估,但这是您获得的最佳效果。
即使使用模板方法模式之类的东西,也需要指定泛型类型参数。如果您只想要DoSomething
方法,则需要将其提升为更高的基类(或接口),以便您可以保持对 类型的引用,并将其调用(非通用)功能。
对于你的评论,我将采取的解决方案是这样的;将公共代码重构为基类中的模板方法模式。然后让&#34;触发&#34; function是来自非泛型基类(或接口)的非泛型继承成员。现在,您可以保留对该类型的引用,并调用模板方法以使其他调用发生。
public void DoAwesomeStuff() //inherited from non-generic parent or interface
{
LoadContents(FunctionToGetContents());
DoSomething();
}
然后:
IDoesAwesomeStuff ObjectToUse = new FOO();
ObjectToUse.DoAwesomeStuff();