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# 的访问修饰符的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中修饰符的基础结构和行为

Java中各种(类方法属性)访问修饰符与修饰符的说明

JAVA中访问修饰符的作用

Java中各种(类方法属性)访问修饰符与修饰符的简单说明

C# 中的访问修饰符

没有访问修饰符的字段,java [重复]