Java 和 Scala 中 C# 的访问修饰符的等价物是啥?
Posted
技术标签:
【中文标题】Java 和 Scala 中 C# 的访问修饰符的等价物是啥?【英文标题】:What are the equivalents of C#'s access modifiers in Java and Scala?Java 和 Scala 中 C# 的访问修饰符的等价物是什么? 【发布时间】:2014-05-22 23:34:01 【问题描述】:我以前使用 C# 工作过,现在我花了很多时间在 Scala 和 Java 上工作。这可能会造成混淆,因为这三种语言的访问修饰符使用相似的名称,但并不总是表示相同的意思。
C# 在 Java 和 Scala 中的访问修饰符等价物是什么?
【问题讨论】:
我正在尝试回答我自己的问题,这是值得鼓励的。 (meta.stackexchange.com/questions/17845/…) 欢迎任何更正和改进。我搜索了这个,但在一个地方找不到总结的信息,我认为这些信息很有用。 所有这些信息都已被充分记录在案。对每种相关语言的访问修饰符进行简单的 google 搜索,可以得到大量关于它们是什么以及它们做什么的有用信息。您自己回答问题的事实绝不会降低问题质量的标准;问一个明显缺乏研究工作的问题是一个低质量的问题,你可能发布的任何答案都不会改变这一点。 @Servy 我确实做过研究,你说得对,可以通过结合几个结果来收集信息,例如:tutorialspoint.com/scala/scala_access_modifiers.htmj2eethoughts.wordpress.com/2010/12/12/…msdn.microsoft.com/en-us/library/ms228632(v=vs.90).aspx 但是我觉得拥有将所有信息汇总在一个地方作为快速参考很有用,因此如果我有博客,我会写这种东西。 我在上面链接的 meta.***.com 的答案说:“在 Stack Overflow 之前,我会写一篇博文,这样我以后就可以用谷歌搜索它了。Jeff 和 Joel 我认为特别说 SO 是一个好地方替换这些博客文章。”所以这就是我试图做的。 如果你能以这样一种方式做到这一点,使帖子成为一个可接受的 SO 问题,那就太好了。事实上,它不是,因为它只是重复已经广泛访问的信息。 【参考方案1】:以下是 Java 和 Scala 中与 C# 访问修饰符最接近的等价物。 在内部(可在同一个程序集中访问)的情况下,没有完全等价的。 在 Java 中,您可以限制对同一个包的可访问性,但包更直接地等同于 C# 的命名空间,而不是它们程序集。
(下表中的“无修饰符”被解释为适用于类成员。也就是说,在C#中,没有修饰符的类成员是私有的。***类型不是这样,默认为内部。)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| C# | Java | Scala | Meaning |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| no modifier | private (1) | private | accessible only within the class where it is defined |
| private | | | |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| protected | -- | protected | accessible within the class and within derived classes (2) |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| internal | no modifier | private[package_name] | accessible within the same assembly (C#) or within the same package (Java / Scala) (3) |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| protected internal | protected | protected[package_name] | accessible within derived classes (2) and anywhere in the same assembly (C#) or package (Java / Scala) (3) |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| public | public | no modifier | accessible anywhere |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1) 在 Java 中,内部类的私有成员对外部类可见,但在 C# 或 Scala 中则不然。在 Scala 中,您可以说 private[X],其中 X 是获取 Java 行为的外部类。
(2) 在 C# 和 Scala 中,如果受保护的成员是该类的实例或进一步派生类的成员,则该成员在类中可见,但如果它是派生较少的类的实例的成员,则该成员不可见. (在 Java 中也是如此,除非它由于在同一个包中而可以访问。)
示例(在 C# 中):
class Base
protected void Foo()
void Test()
Foo(); // legal
this.Foo(); // legal
new Base().Foo(); // legal
new Derived().Foo(); // legal
new MoreDerived().Foo(); // legal
class Derived : Base
void Test1()
Foo(); // legal
this.Foo(); // legal
new Base().Foo(); // illegal !
new Derived().Foo(); // legal
new MoreDerived().Foo(); // legal
class MoreDerived : Derived
void Test2()
Foo(); // legal
this.Foo(); // legal
new Base().Foo(); // illegal !
new Derived().Foo(); // illegal !
new MoreDerived().Foo(); // legal
(3) 在 Scala 中,您可以通过指定最内层的包来获取 Java 行为,但您也可以指定任何封闭的包。
【讨论】:
您在 Scala 表中的第一行,no modifier
。 Scala 不是默认公开的吗(如下所示)?除非我看错了你的表。
在第一个单元格中,我在 private 下没有列出任何修饰符,以表明它们在 C# 中是相同的。也许我可以说得更清楚一点?
那么C#中没有修饰符就等于其他语言中的private
?
C# 中的 no 修饰符相当于其他语言中的 private
,并且它相当于 C# 中的 private
。也就是说,private
是默认值。但是,这仅适用于班级成员,我相信***班级默认为内部班级。我可能应该编辑以包含该信息。
在 Scala 中,您有 sealed
模板(这是语言规范中使用的“特征或类”的通用术语),可以在同一编译单元中扩展(通常:同一个文件),但不能扩展到它之外(即来自外部的final
)。在 C#(我认为)或 Java(我知道)中都没有等价物,但在您希望(抽象)模板具有完全给定的子类集的情况下,它非常有用。例如,这就是您对封闭代数和类型进行编码的方式。以上是关于Java 和 Scala 中 C# 的访问修饰符的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章