我有一个继承自A类的B类,它继承自接口I.这个接口公开了一个方法M,当然是由A实现的,但我想在B中覆盖它。此外,我想从A.M
致电B.M
。我该怎么做?
编辑:答案让我觉得有点愚蠢,特别是因为我知道virtual
意味着什么,事实上,我已经尝试过了:
class A
{
virtual void I.M() // fails
我甚至从未考虑过明确地实现接口。
谢谢大家。
答案 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程序
虚拟和新
之间的差异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
中制作Mvirtual
interface ISome
{
void M();
}
class B : ISome
{
public virtual M()
{
}
}
class A : B
{
public void override M()
{
base.M();
}
}