gpt4 book ai didi

C# 派生类,重载解析

转载 作者:太空狗 更新时间:2023-10-29 22:15:04 25 4
gpt4 key购买 nike

好的,我有一些从基类派生的不同对象,我已经将其中的一堆放在一个列表中。我想遍历列表并将每个列表推送到一个方法。我有各自的类型签名的单独方法,但编译器在提示。有人可以解释为什么吗?这是使用泛型的机会吗?如果是,如何使用?

class Base { }
class Level1 : Base { }
class Level2 : Level1 { }

...

List<Base> oList = new List<Base>();
oList.Add(new Level1());
oList.Add(new Level2());

...

...
foreach(Base o in oList)
{
DoMethod(o);
}

...

void DoMethod(Level1 item) { }
void DoMethod(Level2 item) { }

我做错了什么?

最佳答案

重载在编译时 解决 - 而您没有 DoMethod(Base item) 方法 - 因此它无法解决调用。抛开列表和循环不谈,你实际上是在写:

Base o = GetBaseFromSomewhere();
DoMethod(o);

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

这里有几个选项:

  • 正如 Markos 所说,您可以在 C# 4 中使用动态类型,使 C# 编译器在执行时使用 实际 类型的对象应用重载,o 指的是。
  • 您可以使用 Visitor Pattern有效地获得双重 dispatch (我从来都不喜欢这个)
  • 您可以使用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)
    }
    }

    再一次,这很丑

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

关于C# 派生类,重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3418931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com