38

当我实现一个interface方法时,我不得不把它变成一个public方法。

我们可能会遇到想要使用的default情况(例如在同一个包中访问的情况下)或protected.

谁能解释一下这个限制背后的原因?

4

5 回答 5

59

接口旨在定义一种类型的公共API - 仅此而已,而不是其实现。因此,您在接口中定义的任何方法(或静态成员)都是按定义的public

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

于 2012-03-08T08:30:57.327 回答
12

也许会提供一些答案。

据我所知,您曾经interfaces允许来自您的代码之外的人与您的代码进行交互。为此,您需要定义您的方法public

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

于 2012-03-08T08:31:48.370 回答
1

An interface is a contract that the class that implements it will have the methods in the interface. The interface is used to show the rest of the program that this class has the methods and that they could be called

于 2012-03-08T08:33:40.773 回答
0

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

接口方法在 C# 中是隐式公共的,因为接口是旨在供其他类使用的协定。此外,当您实现接口时,您必须将这些方法声明为公共的,而不是静态的。

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

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

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

只需将接口视为要实现的合同public

于 2014-03-24T16:46:00.203 回答
-1
  1. 如果我们将接口方法标记为私有,则实现类将看不到该方法并且无法覆盖它。

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

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

于 2016-06-14T10:34:49.143 回答