【发布时间】:2011-05-03 10:38:17
【问题描述】:
当一个类实现一个接口时,接口成员的类型修饰符应该是公共的。为什么会有这样的限制?
【问题讨论】:
-
mempublic?另外:“类型修饰符”是指“可访问性修饰符”吗?
-
接口成员是隐式公开的。不是实现。
当一个类实现一个接口时,接口成员的类型修饰符应该是公共的。为什么会有这样的限制?
【问题讨论】:
接口定义了其他对象如何与实现该接口的类型的对象进行通信;由于其他对象只能与其他类型的公共属性和方法交互,因此接口必须将这些属性和方法定义为公共的。
【讨论】:
实现接口方法有两种方式;第一个是 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(); }
所以:如果您不想要公共成员;使用显式实现。
【讨论】:
假设一个接口可以有私有成员。当一个类继承接口时,该类将永远无法访问私有成员。该类将永远无法实现私有成员,并且程序永远不会被编译。
【讨论】: