C#派生类,重载解析

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)

我究竟做错了什么?

Jon*_*eet 7

重载在编译时解决- 您没有DoMethod(Base item)方法 - 因此它无法解析调用.离开列表和循环,你有效地写:

Base o = GetBaseFromSomewhere();
DoMethod(o);
Run Code Online (Sandbox Code Playgroud)

编译器必须找到一个DoMethod适用于单个类型参数的方法Base.没有这样的方法,因此失败了.

这里有几个选项:

  • 正如Markos所说,您可以在C#4中使用动态类型来使C#编译器在执行时使用引用的实际对象类型应用重载o.
  • 你可以使用访客模式有效地获得双重调度(我从来没有真正喜欢这个)
  • 你可以使用asis:

    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)

    再次,这非常难看

  • 如果可能的话,重新设计你正在做的事情,以便能够使用正常继承