【问题标题】:c# interface public private [duplicate]c#接口公共私有[重复]
【发布时间】:2014-09-21 21:55:38
【问题描述】:

谁能解释一个接口如何被强制实现为私有或公共的。通常当我定义一个接口时,每个方法/属性都是公共的。在示例中,使用“IEnumerable”生成公共方法“GetEnumerator()”,但使用接口“IEnumerable”时,方法“IEnumerable.GetEnumerator()”默认为私有。

public class customEnumerable<T> : IEnumerable<T>, IEnumerable
{

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

谢谢!

【问题讨论】:

  • 接口中定义的所有方法都是公共的,因为接口定义了公共契约。私有方法是一个实现细节,因此它们在接口中没有位置。
  • IEnumerable.GetEnumerator() 根本不是私有的,只能通过接口实例访问,这就是区别
  • 实现接口的公共方法方式称为隐式实现,IEnumerable.GetEnumerator() 实现方式称为显式实现。请参阅 Iridium 提到的链接以获得更清晰的信息
  • Visual Studio 使用“实现接口”选项创建上述代码。我可以在相关问题中看到,使用“显式”选项它不会将方法填充为公共

标签: c# interface


【解决方案1】:

私有成员作为接口的一部分毫无意义,因为接口中定义的所有方法都是公共的。接口用于定义一组方法、一个角色、一个对象必须始终实现。

私有方法只是实现细节,不适合公众使用。

根据 MSDN

CLR 还允许接口包含静态方法、静态 字段、常量和静态构造函数。但是,符合 CLS 的 接口不能有任何这些静态成员,因为有些 编程语言无法定义或访问它们。实际上, C# 阻止接口定义任何静态成员。在 此外,CLR 不允许接口包含任何实例 字段或实例构造函数。

更多详情请参考:-C# Interfaces. Implicit implementation versus Explicit implementation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2011-06-18
    • 2017-07-25
    • 1970-01-01
    • 2013-09-17
    • 2013-01-31
    相关资源
    最近更新 更多