这是一道面试中非常基础的问题,我们能否在接口内声明私有方法。我的回答很简单,在接口中我们只能拥有公共变量或方法。那么下一个问题来了...为什么呢?
public
: 在C#中,接口成员默认为公共的,因此这个可以工作。internal
: 如果单个接口成员可以声明为internal
,那么这意味着接口的一部分只能由该接口所在程序集中的类来实现。当抽象类成员或抽象类的构造函数被声明为internal
时,已经存在类似的情况 - 这有效地防止了基类程序集之外的子类化。protected
: 受保护的成员仅从其自身类及其任何子类中可见。应用上述假设,这意味着只有接口声明本身内的代码(接口几乎不能包含与此相关的代码1),派生的接口(与前面相同)和可能实现接口的类才能看到这些受保护的成员。private
: 所有具有private
可见性的内容仅对声明接口本身可见。由于接口成员几乎不能从接口本身引用1,因此这可能不是非常有用。但是,仍然可能存在一些角落情况,例如在接口中定义的const
定义,在该接口中的属性中引用,但不应对外部代码可用 - 但是,C#不允许在接口中使用const
值,即使CLI世界中也没有类似的功能。接口是类所需实现的合同,以确保某个给定类的使用者将接收必须实现接口的类的实例。
如果接口允许私有成员,那么无法调用公共表面隐藏的接口成员的事实将破坏接口的目的,因为使用者将无法调用这些私有成员(那么它为什么要使用接口呢?)。
例如,接口为对象提供类型。如果某些使用者代码依赖于接收实现某个接口的对象,以避免对使用它的程序集和整个程序集产生冗余依赖关系,但整个程序集都可以访问不公开提供成员的接口,那么该使用者如何使用所谓的对象?
public interface IDoesSomething
{
private void Do();
}
public void SomeMethod(IDoesSomething some)
{
some.????? // <---- what? the object doesn't have public members!
}
答案太简单了;
当一个类继承自一个接口时,该接口的成员和方法应该可以被该类访问,这就是为什么它们必须是公共的。