我想实例化一个特征并覆盖受保护的函数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并覆盖方法f和g的特征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)
?
谢谢!
在 Java 中,受保护的成员可以被子类和定义该成员的包访问,而在 Scala 中,成员仅对子类可见。
在您的情况下,代码可能是从实现 A 的类外部调用的(例如从工作表)
如果你想模拟Java行为,那么你可以使用表示法
protected[package_name] def g(i: Int) = println(i)
Run Code Online (Sandbox Code Playgroud)
然后,该方法g()将在包内可见package_name
| 归档时间: |
|
| 查看次数: |
4079 次 |
| 最近记录: |