在C#中,你能否举一个好的例子,说明为什么要在基类上实现接口,并在派生类上重新实现该接口,而不是将基类方法设置为虚拟方法。
例如:
这将会打印出以下内容:
例如:
interface IMakesNoise
{
void Speak();
}
class Cat : IMakesNoise
{
public void Speak()
{
Console.WriteLine("MEOW");
}
}
class Lion : Cat, IMakesNoise
{
public new void Speak()
{
Console.WriteLine("ROAR");
}
}
测试行为:
Cat cat = new Cat();
Cat lion = new Lion();
// Non virtual calls, acts as expected
cat.Speak();
lion.Speak();
// Grabbing the interface out is 'virtual' in that it grabs the most derived interface implementation
(cat as IMakesNoise).Speak();
(lion as IMakesNoise).Speak();
这将会打印出以下内容:
MEOW
MEOW
MEOW
ROAR
更新:为了更好地解释“为什么”,原因是我正在实现一个编译器,我想知道C#选择接口这种实现方式的原因。
Lion
类中的方法声明为public override void Speak()
,这样就可以完全摆脱那个糟糕的“MEOW”了。 - jmodrak