如何覆盖从基类继承的方法,而基类又从接口实现它?

时间:2011-03-04 15:33:16

标签: c#

我有一个继承自A类的B类,它继承自接口I.这个接口公开了一个方法M,当然是由A实现的,但我想在B中覆盖它。此外,我想从A.M致电B.M。我该怎么做?


编辑:答案让我觉得有点愚蠢,特别是因为我知道virtual意味着什么,事实上,我已经尝试过了:

class A
{
    virtual void I.M()           // fails

我甚至从未考虑过明确地实现接口。

谢谢大家。

4 个答案:

答案 0 :(得分:9)

好吧,要么你需要在A中创建虚拟方法,要么需要重新实现B中的接口,这会变得混乱。这是更简单的版本:

using System;

public interface IFoo
{
    void M();
}

public class A : IFoo
{
    public virtual void M()
    {
        Console.WriteLine("A.M");
    }
}

public class B : A
{
    public override void M()
    {
        base.M();
        Console.WriteLine("B.M");
    }
}

class Test
{
    static void Main()
    {
        IFoo foo = new B();
        foo.M();
    }
}

...这里是重新实现IFoo隐藏 A.M()而不是覆盖它的版本:

using System;

public interface IFoo
{
    void M();
}

public class A : IFoo
{
    public void M()
    {
        Console.WriteLine("A.M");
    }
}

public class B : A, IFoo
{
    public new void M()
    {
        base.M();
        Console.WriteLine("B.M");
    }
}

class Test
{
    static void Main()
    {
        IFoo foo = new B();
        foo.M();
    }
}

请注意,如果您有:

A a = (A) foo;
a.M();

致电A.M(),而不是B.M()

答案 1 :(得分:1)

当你在A类中实现方法M时,将其实现为“虚拟”,然后当你想在B类中覆盖它时,使用“override”关键字,这将允许你这样做。

interface I {
    void M();
}

class A : I {
    virtual void M() {

    }
}

class B : A {
    override void M() {
        //Do stuff;
        base.M();
    }

}

答案 2 :(得分:1)

您也可以使用New关键字来隐藏基础M,这是一个简短的linqpad程序

虚拟和新

之间的差异

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-s-the-difference-between-code-override-code-and-code-new-code.aspx

void Main()
{
    var x = new B();
    x.M();
}

public interface I
{
    void M();
}
public class A : I
{
    public void M()
    {
        "A.M".Dump();
    }
}
public class B : A
{
    public new void M()
    {
        "B.M".Dump();
        base.M();
    }
}

结果:

B.M
A.M

答案 3 :(得分:1)

在A

中制作M virtual
interface ISome
{
   void M();
}

class B : ISome
{
   public virtual M()
   {
   }
}

class A : B
{
   public void override M()
   {
      base.M();
   }
}
相关问题