opt*_*nal 12 scala protected this
我有以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
在课堂上Base
,如果我的标签protected
与this
,代码工作正常; 如果我不标记它this
,一切都按预期工作.
是protected
和protected[this]
相当于Scala呢?如果是,为什么Scala会同时提供?如果没有,它们有何不同?
opt*_*nal 13
斯卡拉protected
和它的兄弟姐妹protected[this]
,protected[pkg]
是有点势不可挡,但我发现很容易记住通过使用该解决方案的Java的理念protected
.1st如何在Java中看到受保护的成员
显然,它们对课堂本身是可见的.
但是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);
}
Run Code Online (Sandbox Code Playgroud)
如果受保护的成员是合格的.this
它只能this
在类和子类中访问,它不能被声明类或子类的其他实例访问,例如
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
}
Run Code Online (Sandbox Code Playgroud)
由于Scala默认情况下不支持受保护成员的包级别访问.但是如果要在包级别使其可用,则需要明确指定包,例如protected[pkg]
.现在,如果在pkg或更低版本中声明的类中访问它们,则可以通过声明类/子类实例来看到此受保护成员.
例如
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) ;
}}
Run Code Online (Sandbox Code Playgroud)
这就是人们如何记住Scala protected