连接项目,但我真的不明白支持此内容会有什么问题。 say我有以下代码:
public interface IInterface
{
void Method();
}
public class Base : IInterface
{
virtual void IInterface.Method()
{
throw new NotImplementedException();
}
}
虚拟标识符有什么问题?拥有虚拟修饰符将使
override
表示基类中有不同的实现。我可以通过删除虚拟方法并创建这样的派生类来使其正常工作:
public class Derived : IInterface
{
void IInterface.Method()
{
throw new NotImplementedException();
}
}
无论如何,我真的没有迹象表明我要覆盖某些东西。 update:
根据C#(部分:20.4.1显式接口成员实现)规格有2个原因。
删除某些方法(我正在使用它)。
鉴于答案,我认为我应该在这里重述一个真正的问题。如果以上两个原因是首先使界面显式实施成为可能的原因。如果您制作方法虚拟方法,为什么这是一个问题。
方法可以显式地实现接口具有特殊的可见性范围=除非将“此”施放到目标接口类型,否则您将无法从另一种方法中加速它。 我想这就是为什么不支持虚拟说明符的原因 - 您不能覆盖不是普通对象界面(私有/受保护/公共)的一部分的方法。
public class Base : IInterface
{
protected virtual void Method()
{
}
void IInterface.Method()
{
this.Method()
}
}
public class Derived : Base
{
protected override void Method()
{
}
}
无论如何,我真的没有迹象表明我要覆盖某物
实现了接口?阅读代码时,它会给您带来什么区别?的主要好处是确保我确实拥有正确的签名 - 它与我试图覆盖的东西相匹配。您已经在显式接口实现方面已经获得了好处,就好像您给出了不存在的方法或错误的参数等,编译器将已经抱怨。 我可以看到您的观点,但我从来没有发现它是一个实际的问题。对我来说,说明
override
能够具有显式接口实现,仅在一种情况下是有用的:当派生的级别的替代需要调用父级实现时。 不幸的是,即使可以虚拟实现显式接口实现,但覆盖类别没有任何新的语法来调用其父母的实现。 VB.NET通过允许使用与接口方法不同的名称来声明接口的方法来很好地处理这一点。 因此,派生类可以覆盖
Protected
方法(使用适当的名称),并且覆盖可以调用父级版本(使用同名名称)。
如果只有一个界面是继承的,为什么需要做:
Protected
public class Base : IInterface
{
virtual void IInterface.Method()
{
throw new NotImplementedException();
}
}
我认为原因可以简单地显示在以下示例中。考虑此代码:
public class Base : IInterface
{
virtual void Method()
{
throw new NotImplementedException();
}
}