【发布时间】:2018-10-31 09:10:34
【问题描述】:
让我们考虑一个示例层次结构
class BaseClass{}
class ChildClass1 : BaseClass{}
class ChildClass2 : BaseClass{}
现在我有一个 BaseClass 类型的通用列表
List<BaseClass> sampleList = new List<BaseClass>();
在这个列表中,我添加了 ChildClass1 和 ChildClass2 的对象。
现在当访问这些对象时,我想对不同类型的对象做不同的操作。
我可以使用if-else 轻松实现此目的,并检查对象是否为所需类型。
class SampleClass
{
int Property{get;set;}
List<BaseClass> sampleList = new List<BaseClass>();
void DoCalculations()
{
foreach(var obj in sampleList)
{
if(obj is ChildClass1){//Do something to this.Property}
else if(obj is ChildClass2){//Do Somethingto this.Property}
}
}
}
但是由于复杂性和性能问题,我想避免if-else 或switch(我的真实案例包含大量派生类)。
因此,为了解决这种情况,我想出了一种方法,让重载方法具有相同的名称但类型不同(每个派生类型都对应)。
我想到了以某种方式迭代 BaseClass 并将其转换为 ChlidClass 对象并将其传递给 DoSomething() 方法,重载本身将负责执行哪个操作。但是,我无法从 BaseClass 中获取 ChildClass 类型的对象以动态工作。
我试过的是:
class SampleClass
{
int Property{get;set;}
List<BaseClass> sampleList = new List<BaseClass>();
public void DoCalculations()
{
foreach(var entry in sampleList)
{
Type type = entry.GetType();
var obj = entry as type; //getting error here
this.DoSomething(obj);
}
}
private void DoSomething(ChildClass1 obj){//Do something to this.Property}
private void DoSomething(ChildClass2 obj){//Do something to this.Property}
}
在上面的代码中,我只展示了一个属性int Property{get;set;} 的使用,但在我的实际案例中,考虑了多个属性。
有什么方法可以实现我的需要吗?
编辑: 正如下面提到的 cmets 和在 BaseClass() 中有一个方法并在 ChildClasses 中覆盖它们的几个答案,这在我的情况下可能实际上不起作用,因为 DoSomething() 与它定义的类的全局字段属性一起工作. 不特定于 ChildClass 的对象。
【问题讨论】:
-
使
DoSomething成为BaseClass的实例方法并在派生类中覆盖它。 -
@Adrian 我已经更新了关于为什么您建议的方法可能不适用于我的要求的问题。
-
您可以通过该类中的覆盖轻松访问
Child1中声明的任何字段。我没看到问题。也许您应该创建另一个问题或至少发布当前代码 -
LINQ 的
OfType在这里有帮助吗? -
"定义它的类的全局字段属性。它不特定于 ChildClass 的对象。"是否定义了这些字段/属性(没有全局字段属性,它是静态/实例字段或静态/实例属性)?你能多展示一些你的课程吗?
标签: c# .net inheritance