Java2C#翻译:C#接口中的公共方法

Posted

技术标签:

【中文标题】Java2C#翻译:C#接口中的公共方法【英文标题】:Java2C# translation: public methods in Interfaces in C# 【发布时间】:2010-11-05 13:00:43 【问题描述】:

另一个翻译问题,这可能更具理论性,但我对设计选择感到好奇。 SFNQ:

为什么 C# 不允许像 Java 那样控制对接口中方法的访问控制?例如,在 C# 接口中:

   public void Visit(Axiom axiom);

谢谢。

【问题讨论】:

【参考方案1】:

在 C# 中,接口的所有成员都必须是公共的,因此不允许您在成员声明中添加任何可见性修饰符。因此 public 关键字是多余的并且不需要(事实上,如果你包含它,你会得到一个编译器错误)。

接口是一种契约,它规定您将提供接口定义中指定的所有功能。如果您被允许在接口中拥有私有成员,您将不会公开该功能(因此您会违反合同)。

【讨论】:

+1 用于解释为什么接口方法总是公开的。事实上,你应该得到更多。提示提示,人们!【参考方案2】:

在 C# 和一般的 .Net 中,接口上的所有方法默认情况下都是公共的。没有办法限制他们的访问。

考虑另一种选择,在接口上拥有一个受保护的成员意味着什么?您将如何建立访问规则以允许或禁止接口调用者访问特定方法? (我的意思是 C# 意义上的受保护,而不是 Java)。

更好的是,私有是什么意思?

【讨论】:

另一方面,internal/Friend 在理论上可能是有道理的。不过,这并不是我曾经需要的。 虽然这些选项没有意义,但有时允许内部接口的内部实现而不求助于显式接口实现会很好。 您可以拥有多个接口,使用不同的方法集,并将它们交给不同的客户。 @Jon Skeet:如果接口是内部的,为什么不将其标记为内部?这些方法可能是公共的,但接口的使用只能是内部的。如果您显式实现内部接口,那么您的显式实现实际上将是内部的。【参考方案3】:

在 C# 和 Java 中,接口上的所有方法都是公共的。

在 Java 中,允许使用 public 关键字,可能会节省解析规则。在 C# 中,public 关键字被认为是多余的,并从接口声明中完全删除。

【讨论】:

更正:在 Java 中,public 关键字是可选的,如果存在将被忽略。 不仅是多余的,将它放在那里实际上是一个编译器错误。从 Java 到 C#,我一直感到沮丧。 谢谢。但这不仅仅是“冗余”,如果我尝试将其放入,编译器会骂我。 @Eric Petroejle @Dervin Thunk:我意识到这不是很清楚。为清晰起见进行了编辑。

以上是关于Java2C#翻译:C#接口中的公共方法的主要内容,如果未能解决你的问题,请参考以下文章

C# 8: 默认接口方法

C#基本语法学习

C# 基础知识

c#抽象方法:内部公共和虚拟?

[翻译] C# 8.0 接口默认实现

c#关于接口