[英]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程序
虚拟与新事物之间的差异
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.