这是我的情况:
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)
首先,当您有问题发布实际编译的代码时,它会很有帮助.当问题充满缺失的修饰语和拼写错误时,很难分析问题; 很难知道问题是否是错字.
一旦我们完成了修复程序以便实际编译的工作,编译器就会发出一个警告,告诉你重载看起来不对.既然你的问题是"为什么超载错了?" 读取我们精确发出的编译器警告可能是个好主意,以便您可以分析这个问题.
问题是派生类包含一个名为"name" 的新方法,而不是现有方法的覆盖.这就是警告试图告诉你的.
有两种方法可以解决此问题,具体取决于您是将该方法设为"新"还是"覆盖".如果您希望该方法为"覆盖",则使基本实现成为虚拟,并使派生实现覆盖.
如果您希望该方法为"new",并且仍希望新方法将绑定替换为接口实现,则使用接口重新实现:
class SpecialContainer: FuzzyContainer, IContainer
{
public new string Name()
{
return base.Name() + " Special Container";
}
}
Run Code Online (Sandbox Code Playgroud)
请注意"新"以及我们已重新声明此类实现IContainer 的事实.这告诉编译器"忽略从基类推断出的IContainer方法的绑定并重新开始."
归档时间: |
|
查看次数: |
267 次 |
最近记录: |