scala 覆盖受保护的成员函数

use*_*103 8 scala

我想实例化一个特征并覆盖受保护的函数g,使其可访问(函数f用于测试)。

trait A {
    protected def g( i: Int ) = println( i )
    def f( i: Int ) = println( i )
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个对象 a1

val a1= new A {
    override def f( i: Int ) = super.f(i)
    override def g( i: Int ) = super.g(i)
    def h( i: Int ) = super.g(i)
}
Run Code Online (Sandbox Code Playgroud)

并试图调用这些方法

a1.f(1)
a1.g(3)    // this call fails
a1.h(5)
Run Code Online (Sandbox Code Playgroud)

对于a1.g(3)我得到这个错误:

<console>:10: error: method g in trait A cannot be accessed in A{def h(i: Int): Unit}
   Access to protected method g not permitted because
   enclosing object $iw is not a subclass of 
   trait A where target is defined
                      a1.g(3)    // this call fails
Run Code Online (Sandbox Code Playgroud)

但是当我定义扩展A并覆盖方法fg的特征A2 时,创建它的一个实例并调用这些方法,一切正常

trait A2 extends A {
    override def f( i: Int ) = super.f(i)
    override def g( i: Int ) = super.g(i)
    def h( i: Int ) = super.g(i)
}
val a2= new A2 {}

a2.f(2)
a2.g(4)
a2.h(6)
Run Code Online (Sandbox Code Playgroud)

为什么有区别

val a1= new A {
    override def g( i: Int ) = super.g(i)
}
Run Code Online (Sandbox Code Playgroud)

trait A2 extends A {
    override def g( i: Int ) = super.g(i)
}
val a2= new A2 {}
Run Code Online (Sandbox Code Playgroud)

?

谢谢!

rar*_*rry 3

在 Java 中,受保护的成员可以被子类和定义该成员的包访问,而在 Scala 中,成员仅对子类可见。

在您的情况下,代码可能是从实现 A 的类外部调用的(例如从工作表)

如果你想模拟Java行为,那么你可以使用表示法

protected[package_name] def g(i: Int) = println(i)
Run Code Online (Sandbox Code Playgroud)

然后,该方法g()将在包内可见package_name