【发布时间】:2014-10-14 18:25:45
【问题描述】:
我正在尝试清理现有代码库,但在对抽象类的不同派生类使用通用引用名称时遇到了问题。
例如:
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();
...
编辑:
根据我很快收到的 cmets(再次感谢大家)是否会比删除 Generic (Base<T>) 并拥有所有类型 Base() 的类更好,然后我可以将 ObjectToUse 简单地定义为 Base ObjectToUse;我相信。
【问题讨论】:
-
这行不通。您的课程
Base<string>和Base<byte>没有共同的祖先。 -
为什么不直接使用接口呢?如果
FOO和BAR都实现了IDoSomething,它刚刚声明了一个DoSomething()方法签名,那么你就可以做生意了。 -
@Sjips 实际上他们确实这样做了(CommonRequiredObject),但这对他没有任何好处。
-
感谢您的快速帮助。我要避免的是执行与 ObjectToUse 相同的任务。正在执行代码的 if() 中。更多类型,意味着在 if() 结构中重复更常见的代码。也许我可以将 if() 的逻辑移到 Base
类中以返回一个新对象? -
@BradleyDotNET:是的,你是对的,否则
System.Object将是共同的祖先。我的意思是 Base和 Base 没有共同的祖先 Base左右可以共享代码。你的答案解释正确。
标签: c# object polymorphism runtime