Scala - 访问修饰符



本章将引导您了解 Scala 的访问修饰符。包、类或对象的成员可以使用访问修饰符 `private` 和 `protected` 进行标记,如果我们没有使用这两个关键字中的任何一个,则访问将被假定为 `public`。这些修饰符将对成员的访问限制在代码的特定区域。要使用访问修饰符,您需要在其关键字包含在包、类或对象的成员定义中,如下节所示。

私有成员

私有成员仅在其包含成员定义的类或对象内部可见。

以下代码片段示例解释了私有成员:

示例

class Outer {
   class Inner {
      private def f() { println("f") }
      
      class InnerMost {
         f() // OK
      }
   }
   (new Inner).f() // Error: f is not accessible
}

在 Scala 中,访问 (new Inner).f() 是非法的,因为 f 在 Inner 中声明为私有,并且访问并非来自 Inner 类内部。相反,在 Innermost 类中第一次访问 f 是可以的,因为该访问包含在 Inner 类的主体中。Java 将允许这两种访问,因为它允许外部类访问其内部类的私有成员。

受保护成员

受保护成员只能从定义成员的类的子类访问。

以下代码片段示例解释了受保护成员:

示例

package p {
   class Super {
      protected def f() { println("f") }
   }
   
   class Sub extends Super {
      f()
   }
   
   class Other {
      (new Super).f() // Error: f is not accessible
   }
}

在 Sub 类中访问 f 是可以的,因为 f 在 'Super' 类中声明为受保护,而 'Sub' 类是 Super 的子类。相反,不允许在 'Other' 类中访问 f,因为 'Other' 类不继承自 'Super' 类。在 Java 中,后者访问仍然是被允许的,因为 'Other' 类与 'Sub' 类位于同一个包中。

公共成员

与私有和受保护成员不同,不需要为公共成员指定 Public 关键字。公共成员没有显式修饰符。这些成员可以从任何地方访问。

以下代码片段示例解释了公共成员:

示例

class Outer {
   class Inner {
      def f() { println("f") }
      
      class InnerMost {
         f() // OK
      }
   }
   (new Inner).f() // OK because now f() is public
}

保护范围

Scala 中的访问修饰符可以使用限定符进行增强。`private[X]` 或 `protected[X]` 形式的修饰符意味着访问对 X 是私有的或受保护的,“直到” X,其中 X 指定某个封闭的包、类或单例对象。

考虑以下示例:

示例

package society {
   package professional {
      class Executive {
         private[professional] var workDetails = null
         private[society] var friends = null
         private[this] var secrets = null

         def help(another : Executive) {
            println(another.workDetails)
            println(another.secrets) //ERROR
         }
      }
   }
}

注意 - 以上示例中的以下几点:

  • 变量 workDetails 可被 professional 包中的任何类访问。

  • 变量 friends 可被 society 包中的任何类访问。

  • 变量 secrets 只能在实例方法 (this) 内的隐式对象中访问。

广告
© . All rights reserved.