c#运行时多态与抽象基类

时间:2014-10-14 18:25:46

标签: c# object polymorphism runtime

我正在尝试清理现有的代码库,并且在使用通用引用名称到抽象类的不同派生类时遇到了问题。

例如:

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;我相信。

1 个答案:

答案 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();