gpt4 book ai didi

scala - protected 和 protected 区别[this]

转载 作者:行者123 更新时间:2023-12-04 00:58:10 34 4
gpt4 key购买 nike

我有以下代码:

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

protectedprotected[this] Scala 中的等价物?如果是,为什么 Scala 会同时提供两者?如果不是,它们有什么不同?

最佳答案

斯卡拉 protected和它的 sibling protected[this] , protected[pkg]有点压倒性,但是我通过使用 找到了容易记住的解决方案Java protected的哲学.
第一个 protected 成员如何在 Java 中可见

  • 它们对子类可见(子类可能在同一个包或其他包中)
  • 它们对与指定 protected 成员的类位于同一包中的任何类都是可见的。

  • 显然,它们对类本身是可见的。

    但是Scala对它们如何对子类可见有一些限制。默认情况下,它们只对子类可见。它们对声明了类的包不可见。但是存在两种情况,它们在子类中是如何可见的。

    如果 protected 成员未限定(纯 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);

    }

    如果 protected 成员符合 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
    }

    由于默认情况下 Scala 不支持 protected 成员的包级别访问。但是如果您想让它在包级别可用,那么您需要明确指定包,例如protected[pkg] .现在这个 protected 成员在声明类/子类实例时可见,如果它们在 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) ;
    }}

    这就是人们如何记住 Scala protected

    关于scala - protected 和 protected 区别[this],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907956/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com