我们为什么要将接口方法声明为public?

当我实现一个interface方法时,我被迫使它成为一个public方法。

我们可能会遇到以下情况:我们要使用default (如同在相同包中访问的情况)或protected

任何人都可以解释这个限制背后的原因吗?

接口用于定义类型的公共 API – 而不仅仅是它的实现。 因此,您在接口中定义的任何方法(或静态成员)都是public的定义。

由于接口不能包含任何具体实现,因此无法从内部调用任何成员方法。 并且声明这样的方法但是将它们调用到子类或完全不相关的客户端将意味着您的类型定义不完整且易碎。 这就是为什么如果您需要定义受保护或包访问成员,您可以在抽象类(也可能包含实现)中这样做。

也许这会提供一些答案。

据我所知,您使用interfaces允许代码外部的人与您的代码进行交互 。 为此,您需要将方法定义为public

如果您想强制某人覆盖一组给定的私有方法,您可能希望使用一系列抽象受保护方法声明一个抽象类。

接口是一个契约,实现它的类将具有接口中的方法。 该接口用于显示该类具有方法的其余程序,并且可以调用它们

编辑:这个答案适用于C#接口实现。 在Java的这种情况下,场景类似于语法分析器需要在接口中提到的公共关键字,这在C#中隐式完成

接口方法在C#中是隐式公共的 ,因为接口是一个旨在由其他类使用的契约。 此外,在实现接口时,必须将这些方法声明为public ,而不是static。

 interface IStorable { void Read( ); void Write(object obj); } 

请注意, Read( )Write( )IStorable方法声明不包括访问修饰符( publicprotected ..)。 实际上,提供访问修饰符会生成编译错误。

 class Document : IStorable { public void Read( ) { // } public void Write(object obj) { // } } 

只需将接口视为合同即可实现为public接口

  1. 如果我们将接口方法标记为私有,则实现类不会看到该方法并且无法覆盖它。

  2. 如果我们将接口方法标记为受保护,则实现类不会看到该方法,除非它与接口位于同一个包中。

  3. 如果我们标记一个没有任何访问修饰符的接口方法
    实现类不会看到方法,除非它是相同的
    包作为接口