简体   繁体   中英

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

I have a class B that inherits from class A, which in turn inherits from interface I. This interface exposes a method M which, of course, is implemented by A, but I would like to override it in B. Moreover, I would like to call AM from BM . How do I do that?


EDIT: The answers made me feel kind of stupid, especially since I know what virtual means and, in fact, I have tried it:

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

I never even considered not implementing the interface explicitly.

Thank you all.

Well, either you need to make the method virtual in A, or you need to reimplement the interface in B, which gets messy. Here's the simpler version:

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

... and here's the version which reimplements IFoo , hiding AM() instead of overriding it:

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

Note that if you then had:

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

it would only call AM() , not BM() .

When you implement method M in class A, implement it as "virtual", then when you want to override it in class B use the "override" keyword, which will allow you to do just that.

interface I {
    void M();
}

class A : I {
    virtual void M() {

    }
}

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

}

You can use the New keyword to hide the base M as well, heres a short linqpad program

The diffrence between virtual and new

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

Results:

B.M
A.M

Make M virtual in A

interface ISome
{
   void M();
}

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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