【问题标题】:public type modifiers for interface接口的公共类型修饰符
【发布时间】:2011-05-03 10:38:17
【问题描述】:

当一个类实现一个接口时,接口成员的类型修饰符应该是公共的。为什么会有这样的限制?

【问题讨论】:

  • mempublic?另外:“类型修饰符”是指“可访问性修饰符”吗?
  • 接口成员是隐式公开的。不是实现。

标签: c# interface


【解决方案1】:

接口定义了其他对象如何与实现该接口的类型的对象进行通信;由于其他对象只能与其他类型的公共属性和方法交互,因此接口必须将这些属性和方法定义为公共的。

【讨论】:

  • 除非它们不需要公开......它们可以是明确的
  • 虽然在技术上我同意,但我确实考虑使用显式接口来定义一个类型的公共合约;类型实现该接口的事实是其公共定义的一部分,因此获取这些接口成员既容易又保证/必需。 Private 定义了类型封装和隐藏的内容,而接口实际上并不属于该类型。
【解决方案2】:

实现接口方法有两种方式;第一个是 implicit 实现 - 它假定公共 API 正在公开接口方法,这是您毫无疑问看到的。

不过,你也可以使用显式实现:

void IDisposable.Dispose() {
    // clean up
}

是一个简单的例子;这是私有的,但满足接口。显式实现始终优先于公共 API 上的同名方法。

事实上,显式实现通常是必要的,例如实现IEnumerable<T> - 因为有两个冲突的GetEnumerator() 方法;以下是常见的:

// public API will be used for implicit IEnumerable<T>.GetEnumerator()
public IEnumerator<T> GetEnumerator() { ... do work ... }
// explicit implementation of IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

所以:如果您不想要公共成员;使用显式实现。

【讨论】:

    【解决方案3】:

    假设一个接口可以有私有成员。当一个类继承接口时,该类将永远无法访问私有成员。该类将永远无法实现私有成员,并且程序永远不会被编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 2019-07-15
      • 2016-06-25
      • 2017-11-11
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多