解释接口实现不能虚拟实现

问题描述 投票:0回答:4
对于记录,我已经看到了此

连接项目,但我真的不明白支持此内容会有什么问题。 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个原因。
删除某些方法(我正在使用它)。

    具有相同签名但不同返回类型的2个功能 (例如,可用于ICLONABLE)。
  1. 它没有说明为什么您不能虚拟地做这些方法。
  2. update2:

鉴于答案,我认为我应该在这里重述一个真正的问题。如果以上两个原因是首先使界面显式实施成为可能的原因。如果您制作方法虚拟方法,为什么这是一个问题。

方法可以显式地实现接口具有特殊的可见性范围=除非将“此”施放到目标接口类型,否则您将无法从另一种方法中加速它。 我想这就是为什么不支持虚拟说明符的原因 - 您不能覆盖不是普通对象界面(私有/受保护/公共)的一部分的方法。

这是我的解决方法:
c# interface explicit-interface
4个回答
17
投票
public class Base : IInterface { protected virtual void Method() { } void IInterface.Method() { this.Method() } } public class Derived : Base { protected override void Method() { } }

无论如何,我真的没有迹象表明我要覆盖某物

7
投票
so
实现了接口?阅读代码时,它会给您带来什么区别?

对我来说,说明

override
的主要好处是确保我确实拥有正确的签名 - 它与我试图覆盖的东西相匹配。您已经在显式接口实现方面已经获得了好处,就好像您给出了不存在的方法或错误的参数等,编译器将已经抱怨。 我可以看到您的观点,但我从来没有发现它是一个实际的问题。

能够具有显式接口实现,仅在一种情况下是有用的:当派生的级别的替代需要调用父级实现时。 不幸的是,即使可以虚拟实现显式接口实现,但覆盖类别没有任何新的语法来调用其父母的实现。 VB.NET通过允许使用与接口方法不同的名称来声明接口的方法来很好地处理这一点。 因此,派生类可以覆盖

Protected

方法(使用适当的名称),并且覆盖可以调用父级版本(使用同名名称)。


如果只有一个界面是继承的,为什么需要做:

Protected

为什么不只是去:

0
投票
public class Base : IInterface { virtual void IInterface.Method() { throw new NotImplementedException(); } }


我认为原因可以简单地显示在以下示例中。考虑此代码:

public class Base : IInterface { virtual void Method() { throw new NotImplementedException(); } }

-1
投票
,简而言之,如果您明确地实现了具有相同方法签名的多个接口,您的派生类将不知道要覆盖哪种基本方法。

© www.soinside.com 2019 - 2024. All rights reserved.