end*_*ser 5 c# overloading derived-class
好吧,我有一些从基类派生的不同对象,我把它们放在一个列表中.我想遍历列表并将每个推送到一个方法.我对每个类型的签名都有单独的方法,但编译器抱怨.有人可以解释原因吗?这是使用泛型的机会,如果是的话,怎么样?
class Base { }
class Level1 : Base { }
class Level2 : Level1 { }
Run Code Online (Sandbox Code Playgroud)
...
List<Base> oList = new List<Base>();
oList.Add(new Level1());
oList.Add(new Level2());
Run Code Online (Sandbox Code Playgroud)
...
...
foreach(Base o in oList)
{
DoMethod(o);
}
Run Code Online (Sandbox Code Playgroud)
...
void DoMethod(Level1 item) { }
void DoMethod(Level2 item) { }
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
重载在编译时解决- 您没有DoMethod(Base item)方法 - 因此它无法解析调用.离开列表和循环,你有效地写:
Base o = GetBaseFromSomewhere();
DoMethod(o);
Run Code Online (Sandbox Code Playgroud)
编译器必须找到一个DoMethod适用于单个类型参数的方法Base.没有这样的方法,因此失败了.
这里有几个选项:
o.你可以使用as或is:
Level1 x = o as Level2;
if (x != null)
{
DoMethod(x); // Resolves to DoMethod(Level1)
}
else
{
Level2 y = o as Level2;
if (y != null)
{
DoMethod(y); // Resolves to DoMethod(Level2)
}
}
Run Code Online (Sandbox Code Playgroud)
再次,这非常难看
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |