为啥我们应该将接口方法声明为公共的? [复制]

Posted

技术标签:

【中文标题】为啥我们应该将接口方法声明为公共的? [复制]【英文标题】:Why should we declare interface methods as public? [duplicate]为什么我们应该将接口方法声明为公共的? [复制] 【发布时间】:2012-03-25 18:16:59 【问题描述】:

当我实现interface 方法时,我不得不将其设为public 方法。

在某些情况下,我们可能想要使用default(例如在同一个包中访问)或protected

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

【问题讨论】:

如果你想要受保护和私有成员或静态方法和非静态字段,你可以使用abstract class 【参考方案1】:

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

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

【讨论】:

我认为这个答案是正确的,但它基本上是一种迂回的说法,“因为这就是 Java 人想要的。”您也可以为拥有受保护的方法提出完全合理的论据(包私有可能有点难以证明)。但是您当然不能拥有私有方法,因为它们永远不会被继承。我的猜测是,与其说“这个可见性子集,这就是为什么这个但不是那个”,他们认为只说“这是你得到的一个可见性”会更简单。 @yshavit,我试图思考为什么 Java 人希望事情是这样的。上面遗漏的一条信息是,他们专门为语言添加了接口,因为他们想要禁止多重继承,以及它在 C++ 中带来的所有问题。 @yshavit,虽然对任何“拥有受保护方法的完全合理的论据”感兴趣 :-) +1 用于说明接口和抽象类之间的概念差异。 从技术上讲,这些方法都是public——如果你有对象引用,你总是可以得到对接口的引用。【参考方案2】:

也许this 会提供一些答案。

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

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

【讨论】:

“抽象私有方法”...您的意思是“抽象受保护方法”吗? @npinti-简而言之! @BoltClock:是的,你是对的。修复了谢谢:) 或抽象默认(包)范围方法 然而,Joshua Bloch 强烈鼓励我们使用接口作为 -types- 并使用这些类型来引用对象。这是一个好主意,但它开发了两种概念化接口的方法:作为一种以不干扰单继承的方式使用用户定义类型的机制;并作为 API 合同。既然我们有这两个,我同意如果我们不必公开接口方法以保持那些我们不想导出的 UDT 封装,那将是非常好的。【参考方案3】:

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

【讨论】:

是的,但是接口也是类型。有时,程序员希望使用他们创建的类型而不将它们作为 API 的一部分导出。这就是强制公开接口方法很烦人的地方。【参考方案4】:

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

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

interface IStorable

     void Read( );
     void Write(object obj);

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

class Document : IStorable

     public void Read( )
     
         //
     
     public void Write(object obj)
     
         //
     

只需将接口视为 Contracts 以实现为 public

【讨论】:

在Java中,其实需要指定public关键字。 @Groo 我的错,也许我没有看到问题的相关标签。我正在处理 C# 中的案例,我会在编辑中提到这一点。【参考方案5】:

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

    如果我们将接口方法标记为受保护的实现类 除非它与 界面。

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

【讨论】:

以上是关于为啥我们应该将接口方法声明为公共的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java 接口中的方法是不是应该使用或不使用公共访问修饰符来声明?

为啥类成员是私有的而属性是公共的? [复制]

为啥我不能在接口中声明静态方法?

为啥在 JavaScript 对象中使用公共方法? [复制]

为啥要将 Java 接口方法声明为抽象的?

抽象类,接口