C#:我的派生类不能覆盖基类的接口方法实现,为什么?

时间:2016-03-02 03:28:30

标签: c# inheritance interface hide implementation

我已经获得了以下代码,我使用了课程" 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();
    }
}

2 个答案:

答案 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");
    }
}