为什么接口的显式实现不能是公共的?

81

我在类中有一个实现接口的方法。当我将其设置为显式实现时,我收到了编译器错误。

The modifier 'public' is not valid for this item

为什么显式接口实现不允许使用public关键字?

2个回答

78

显式接口实现的原因是为了避免名称冲突,结果是在调用这些方法之前必须将对象明确转换为该接口。

您可以将这些方法视为不公开于类的公共方法,而是直接与接口绑定。没有理由指定public/private/protected,因为它始终是公共的,因为接口不能有非公共成员。

(Microsoft提供了一份关于显式接口实现的概述)


3
对于隐式接口,没有必要将其指定为公共接口,但是可以这样做,实际上必须这样做。因此,暗示公共逻辑的接口并不能真正解释原来的问题。 - liang
对于隐式接口,方法只是一个可以是私有的方法。它的签名使其成为接口方法实现。显式接口定义除了公共之外不能是任何其他访问修饰符。我理解你的观点,但说实话,在隐式方法上允许公共访问修饰符可能只涉及编译器执行操作的顺序。 - Richard Szalay
3
“...因为它总是公共的…”这句话在技术上并不准确,因为在将对象转换为接口之前,无法从外部调用显式实现的函数。” - Masood Khaari
1
@Massood - 他们的可发现性与可访问性无关。这些成员肯定是公共的,因为它们可以从不相关的类中访问,而不仅仅是从声明类(私有)、派生类(受保护)或程序集(内部)中访问。 - Richard Szalay
11
这是“public”定义问题。我检查了C#语言规范,在第13.4.1节的第392页上,它说:“显式接口成员实现具有不同的可访问性特征。因为显式接口成员实现在方法调用或属性访问中永远无法通过其完全限定名称访问,所以它们在某种意义上是私有的。然而,由于它们可以通过接口实例访问,所以从某种意义上也是公共的。” - Masood Khaari
很难为它选择一个明确的访问修饰符,而且“肯定是公共的”可能被排除在外。 - Masood Khaari

29

显式成员实现允许消除接口成员中的歧义。

如果没有显式接口成员实现,一个类或结构体不可能拥有具有相同签名和返回类型的接口成员的不同实现。

为什么接口的显式实现不能是公共的? 当成员被显式实现时,它不能通过类实例访问,只能通过接口实例访问。

public interface IPrinter
{
   void Print();
}
public interface IScreen
{
   void Print();
}

public class Document : IScreen,IPrinter
{
    void IScreen.Print() { ...}
    void IPrinter.Print() { ...} 
}

.....
Document d=new Document();
IScreen i=d;
IPrinter p=d;
i.Print();
p.Print();
.....

显式接口成员实现不能通过类或结构体的实例访问。


10
大多数人不同意你的观点?我很难相信,因为这正是显式接口实现存在的原因。http://msdn.microsoft.com/en-us/library/ms173157.aspx - Richard Szalay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接