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

时间:2016-04-28 07:22:45

标签: scala this protected

我有以下代码:

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中的protectedprotected[this]是否相同?如果是,为什么Scala会同时提供?如果没有,它们有何不同?

2 个答案:

答案 0 :(得分:13)

Scala protected及其兄弟protected[this]protected[pkg]有点压倒性,但我发现使用{{1> 哲学{{1}轻松记住解决方案}。 第一个受保护的成员如何在Java中可见

  1. 它们对子类可见(子类可以在同一个包或其他包中)
  2. 对于与指定受保护成员的类位于同一包中的任何类,它们都可见。
  3. 显然,课程本身就可见。

    但是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.sayHelloother.sayHello没有此限制。