为什么要调用基类?

IaC*_*der 8 c# polymorphism

这是我的情况:

interface Icontainer{
 string name();
}

abstract class fuzzyContainer : Icontainer{
  string name(){
   return "Fuzzy Container";
  }
}

class specialContainer: fuzzyContainer{
  string name(){
   return base.name() + " Special Container";
  }
}


Icontainer cont = new SpecialContainer();
cont.name(); // I expected "Fuzzy Container Special Container" as the output.
Run Code Online (Sandbox Code Playgroud)

当我如上所述运行我的代码时,输​​出只是"模糊容器".我在这里失踪了什么?有没有更好的方法来获得理想的结果?

Mat*_*eer 17

如果你创建name()virtual然后override在specialContainer中,你将获得预期的行为.

public interface Icontainer
{
    string name();
}

public abstract class fuzzyContainer : Icontainer
{
    public virtual string name()
    {
        return "Fuzzy Container";
    }
}

public class specialContainer : fuzzyContainer
{
    public override string name()
    {
        return base.name() + " Special Container";
    }
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 6

首先,当您有问题发布实际编译的代码时,它会很有帮助.当问题充满缺失的修饰语和拼写错误时,很难分析问题; 很难知道问题是否是错字.

一旦我们完成了修复程序以便实际编译的工作,编译器就会发出一个警告,告诉你重载看起来不对.既然你的问题是"为什么超载错了?" 读取我们精确发出的编译器警告可能是个好主意,以便您可以分析这个问题.

问题是派生类包含一个名为"name" 的方法,而不是现有方法的覆盖.这就是警告试图告诉你的.

有两种方法可以解决此问题,具体取决于您将该方法设为"新"还是"覆盖".如果您希望该方法为"覆盖",则使基本实现成为虚拟,并使派生实现覆盖.

如果您希望该方法为"new",并且仍希望新方法将绑定替换为接口实现,则使用接口重新实现:

class SpecialContainer: FuzzyContainer, IContainer 
{
  public new string Name()
  { 
    return base.Name() + " Special Container"; 
  } 
} 
Run Code Online (Sandbox Code Playgroud)

请注意"新"以及我们已重新声明此类实现IContainer 的事实.这告诉编译器"忽略从基类推断出的IContainer方法的绑定并重新开始."

  • @Matt:IEnumerable <T>扩展IEnumerable.两者都有一个名为GetEnumerator的方法,它不带参数.你有三个选择.(1)不要使通用版本类型与非通用版本兼容; 打破扩展关系.(2)在派生接口中为GetEnumerator提供不同的名称.或者(3)使派生版本的GetEnumerator成为"新"方法.您认为哪三个选择最糟糕?我会去(3). (4认同)