繁体   English   中英

如何重写从基类继承的方法,该方法又从接口实现该方法?

[英]How to override a method inherited from a base class, which in turn implemented it from an interface?

我有一个从类A继承的类B,后者又从接口I继承。此接口公开了方法M,该方法M当然是由A实现的,但是我想在B中重写它。此外,我想从BM致电AM 我怎么做?


编辑:答案使我感到很愚蠢,尤其是因为我知道virtual意思,实际上,我已经尝试过:

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

我什至从未考虑过不明确实现接口。

谢谢你们。

好吧,您要么需要在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的版本, 隐藏 AM()而不是覆盖它:

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();

只会调用AM() ,而不会调用BM()

在类A中实现方法M时,将其实现为“虚拟”,然后在类B中覆盖它时,请使用“覆盖”关键字,这将使您可以做到这一点。

interface I {
    void M();
}

class A : I {
    virtual void M() {

    }
}

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

}

您也可以使用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

使A中的M virtual

interface ISome
{
   void M();
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM