Scala中的protected
及其衍生类protected[this]
和protected[pkg]
有些令人不知所措,但我发现通过使用Java的protected
哲学可以轻松记住解决方案。
- 它们对子类可见(子类可以在同一包或其他包中)
- 它们对指定受保护成员的类所在包中的任何类都可见。
显然它们对类本身也是可见的。
但Scala对它们在子类中的可见性有一些限制。默认情况下,它们仅对子类可见。它们对声明类所在的包不可见。然而,在两种情况下它们在子类中是可见的。
如果受保护成员未经资格认证(普通受保护),则它在声明类的另一个实例以及this
在类和子类中都可见,例如:
class Base{
protected val alpha ="Alpha";
protected def sayHello = "Hello";
}
class Derived extends Base{
def hello = println((new Derived()).sayHello) ;
def hello2 = println(this.sayHello);
}
如果受保护成员被限定为 this
,则只能通过类和子类中的 this
访问它,不能被声明类或子类的其他实例访问,例如:
class Base{
protected val alpha ="Alpha";
protected[this] def sayHello = "Hello";
def foo = Console println(new Base().sayHello)
def bar = Console println(this.sayHello)
}
class Derived extends Base{
def hello = println(this.sayHello) ;
}
由于Scala默认不支持对受保护成员进行包级别访问。但是,如果您想在包级别上使其可用,则需要明确指定包,例如protected[pkg]
。现在,如果在pkg或以下声明的类中访问这些受保护成员,则可以在声明类/子类实例的情况下看到它们。
例如:
package com.test.alpha{
class Base{
protected val alpha ="Alpha";
protected[test] def sayHello = "Hello";
}
class Derived extends Base{
val base = new Base
def hello = println(base.sayHello) ;
}}
这是如何记住 Scala 的
protected
关键字。
Derived
中访问base.alpha
吗? - optional[this]
限定符的成员,只能通过this
限定符来访问。如果我需要通过Base
实例访问alpha
,那么我就需要用protected[pkg_of_scbclass]
来限定它,对吗? - optional