受保护和受保护之间的区别[本]

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,如果我的标签protectedthis,代码工作正常; 如果我不标记它this,一切都按预期工作.

protectedprotected[this]相当于Scala呢?如果是,为什么Scala会同时提供?如果没有,它们有何不同?

opt*_*nal 13

斯卡拉protected和它的兄弟姐妹protected[this],protected[pkg]是有点势不可挡,但我发现很容易记住通过使用该解决方案的Java的理念protected.1st如何在Java中看到受保护的成员

  1. 它们对子类是可见的(子类可以在同一个包或其他包中)
  2. 对于与指定受保护成员的类位于同一包中的任何类,它们都是可见的.

显然,它们对课堂本身是可见的.

但是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