我已经获得了以下代码,我使用了课程" B"继承班级" A"我希望从接口IMy实现F功能。但是编译器告诉我我的隐藏界面方法" F"。所以运行结果是" A"。
我希望这个程序输出" B"。我不希望使用隐式接口实现,因为我希望在main函数中使用正常的多态性。
如何更正我的代码?感谢。
public interface IMy
{
void F();
}
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public void F()
{
Console.WriteLine("B");
}
}
class Program
{
static void Main(string[] args)
{
IMy my = new B();
my.F();
}
}
答案 0 :(得分:6)
要覆盖C#中的方法,需要将基类中的方法显式标记为virtual
。该方法是否实现了接口方法无关紧要。
public class A : IMy
{
public virtual void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F()
{
Console.WriteLine("B");
}
}
答案 1 :(得分:4)
您当前的代码相当于:
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public new void F() // <--- Note 'new' here
{
Console.WriteLine("B");
}
}
您隐式将该方法标记为新方法,除非您明确写入,否则会生成编译器警告。
您真正想要的是覆盖该方法,因此声明:
public class A : IMy
{
public virtual void F() // <--- Mark as virtual to allow subclasses to override
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F() // <-- Override the method rather than hiding it
{
Console.WriteLine("B");
}
}