【问题标题】:Why can not an Explicitly implemented member can not be public? [duplicate]为什么不能显式实现的成员不能是公共的? [复制]
【发布时间】:2012-04-27 05:00:43
【问题描述】:

可能重复:
Why Explicit Implementation of a Interface can not be public?

I read this Question。直接从问题开始

interface IRepository<T>
{
    void AddString();
}

interface IStringRepo : IRepository<string>
{
    List<string> GetStrings();
}

public class BLL : IStringRepo
{
    public List<string> FilterStrings()
    {
        return new List<string>() { "Hello", "World" };
    }

    public List<string> IStringRepo.GetStrings()
    {
        throw new NotImplementedException();
    }

    public void IRepository<string>.AddString()
    {
        throw new NotImplementedException();
    }
}

为什么公开明确引用的成员是Error

【问题讨论】:

  • 您希望public 修饰符做什么?你可以(至少从普通的 C# 代码)只能通过接口调用这个方法,因为它没有普通的方法名。
  • 因为语言规范是这么说的。
  • 如果你能做出显式接口实现public,那普通(隐式)接口实现有什么区别?

标签: c# oop


【解决方案1】:

没有任何理由将其设为public,因为通过与它签订合同,您别无选择然后像公众一样实施其所有成员。

但是为什么会报错呢?

原因很简单,所有接口成员都是根据定义公开的。

Interfaces

接口由方法、属性、事件、索引器或任何 这四种成员类型的组合。接口不能包含 常量、字段、运算符、实例构造函数、析构函数或 类型。它不能包含静态成员。接口成员是 自动公开,并且它们不能包含任何访问修饰符。

【讨论】:

  • @downvoter:只是一种激情或将要解释,迟早你为什么要投反对票?
【解决方案2】:

为什么将显式引用的成员设为 public 是一个错误

这是设计使然,想象一下迫使开发人员显式实现接口的最流行的原因之一:memeber name ambiguity,所以你有一个现有的类已经公开了一些公共成员名称,并且您不能更改现有的类 API,因为它被其他系统使用,您也不能更改接口 API(成员名称/签名),并且类和接口都定义了具有相同名称的成员,因此提供 public接口成员的访问修饰符没有意义,因为已经在类中声明了具有相同名称的成员。

MSDN,13.4.1 Explicit interface member implementations

无法访问显式接口成员 通过方法中的完全限定名称实现 调用、属性访问或索引器访问。显式接口 成员实现只能通过接口访问 实例,并且在这种情况下仅由其成员名称引用。

这是显式接口成员的编译时错误 包含访问修饰符的实现,它是一个编译时 包含修饰符 abstract、virtual、override 或 static 时出错。

【讨论】:

    【解决方案3】:

    因为它们不公开,所以这是一种冲突

    你有一个choice 来实现任何一种方式——显式或隐式。

    如果是显式的,则通常是
    因为实施者希望强制您仅通过接口访问它,并且以某种方式对公众隐藏它(简化) - 因此它不是公开的。

    简而言之,这是显式实现的目的之一。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2012-09-15
      • 2010-11-18
      • 2011-06-02
      • 2012-04-22
      • 1970-01-01
      • 2014-01-23
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多