C#中同名方法的多层继承

3

我在这里遇到了麻烦,这是一段已存在的代码,是从别人手中交接给我的。

class A
{
    public string helloworld()
    {
        return "A";
    }
}

class B : A
{
    public string helloworld()
    {

        return "B";
    }
}

class C: B
{
    public string hi()
    {
    if(condition1)
     {
        return helloworld(); // From class A
     }
    else
     {
        return helloworld(); // From class B
     }
    }
}

在某种情况下,应从A类返回方法,否则应从B类返回方法。 如何实现此功能,因为输出始终为“B”?

这段代码无法编译,缺少condition1。请提供一个可以编译并演示您所描述行为的示例。您可能还需要查看虚拟和重写修饰符。 - CodeCaster
你需要调用base.helloworld(),来调用A类中的方法。 - Waqas Shabbir
2个回答

6
if (condition1)
{
    return ((A)this).helloworld(); // From class A
}
else
{
    return ((B)this).helloworld(); // From class B
}

此外,如果B的源代码在您的控制下,则应该在其实现helloworld时添加new关键字(或最好重命名它以避免隐藏),但C.hi中的解决方案仍将保持不变。

请问您能否解释一下上面的答案? - xoanon
1
多态作用于动态类型:C 动态类型既不是 A 也不是 B,但通过将 C 类型的实例(即 this)转换为 AB 中的任一类型,我们可以强制使用所需的动态类型,如原始代码中所示。若没有进行强制类型转换,编译器则会简单地回退到继承树中第一个父类 B - John Castleman

5
你可以这样做:

你可以像这样做

class A
{
    public string helloworld()
    {
        return "A";
    }
}

class B : A
{
    public new string helloworld()
    {
        return "B";
    }
}

class C: B
{
   public string hi(bool condition)
   {
      if(condition)
      {
         A instance = this;
         return instance.helloworld(); // From class A
      }
      else
      {
          B instance = this;
          return instance.helloworld(); // From class B
      }
    }
}

如果您实现了一个隐藏基类方法的方法,编译器会对此发出警告。要告诉编译器这是有意的,请使用 New 关键字。
要调用基类中的实现,您必须将实例强制转换为基类类型。

请问您能否解释一下上面的答案? - xoanon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接