我有以下代码:
class Base{
protected val alpha ="Alpha";
protected def sayHello = "Hello";
}
class Derived extends Base{
val base = new Base;
def hello = println(this.alpha +" "+this.sayHello) ;
// def hello = println(base.alpha +" "+base.sayHello) ; // don't compile
}
object MyObj extends App{
val x=new Derived;
x.hello;
}
在课程Base
中,如果我使用protected
标记this
,则代码按预期工作;如果我没有用this
标记它,一切都按预期工作。
Scala中的protected
和protected[this]
是否相同?如果是,为什么Scala会同时提供?如果没有,它们有何不同?
答案 0 :(得分:13)
Scala protected
及其兄弟protected[this]
,protected[pkg]
有点压倒性,但我发现使用{{1> 哲学{{1}轻松记住解决方案}。
第一个受保护的成员如何在Java中可见
显然,课程本身就可见。
但是Scala对子类的可见性有一些限制。默认情况下,它们仅对子类可见。它们在声明类的包中是不可见的。但是在子类中它们是如何可见的情况下存在两种情况。
如果受保护的成员不是合格的(普通保护的),则可以通过声明类的另一个实例将其声明为类以及将protected
引入类和子类,例如强>
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
由于Scala默认情况下不支持受保护成员的包级访问权限。但是如果要在包级别使其可用,则需要明确指定包,例如class Base{
protected val alpha ="Alpha";
protected[this] def sayHello = "Hello";
def foo = Console println(new Base().sayHello) // won't compile
def bar = Console println(this.sayHello)
}
class Derived extends Base{
def hello = println(this.sayHello) ;
//def hello2 = println((new Derived() .sayHello) // won't compile
}
。现在,如果在pkg或更低版本中声明的类中访问它们,则可以通过声明类/子类实例来看到此受保护成员。
e.g。
protected[pkg]
这是人们记住Scala package com.test.alpha{
class Base{
protected val alpha ="Alpha";
protected[test] def sayHello = "Hello"; // if you remove [test] it won't compile
}
class Derived extends Base{
val base = new Base
def hello = println(base.sayHello) ;
}}
答案 1 :(得分:0)
不同之处在于,使用tsconfig.ts
子类实例只能访问自己的字段(protected[this]
),而使用this.x
,子类可以访问所有实例中的字段(不仅仅是protected
):
this
在此代码中,您可以访问class Base{
protected val alpha ="Alpha";
protected[this] def sayHello = "Hello";
}
class Derived extends Base{
def hello = println(this.alpha +" "+this.sayHello) ;
def hello2 = println(
new Derived().alpha +" "
+new Derived().sayHello) ; // error on "sayHello"
}
,但不能访问this.sayHello
。 other.sayHello
没有此限制。