scala覆盖受保护的成员函数
发布时间:2020-12-16 10:04:28 所属栏目:安全 来源:网络整理
导读:我想实例化一个特征并覆盖受保护的函数g,使其可访问(函数f用于测试). trait A { protected def g( i: Int ) = println( i ) def f( i: Int ) = println( i )} 我创建了一个对象a1 val a1= new A { override def f( i: Int ) = super.f(i) override def g( i:
我想实例化一个特征并覆盖受保护的函数g,使其可访问(函数f用于测试).
trait A { protected def g( i: Int ) = println( i ) def f( i: Int ) = println( i ) } 我创建了一个对象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) } 并试图调用方法 a1.f(1) a1.g(3) // this call fails a1.h(5) 对于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 但是当我定义一个特性A2扩展A并覆盖方法f和g时,创建它的一个实例并调用方法,一切正常 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) 为什么两者之间存在差异 val a1= new A { override def g( i: Int ) = super.g(i) } 和 trait A2 extends A { override def g( i: Int ) = super.g(i) } val a2= new A2 {} ? 谢谢! 解决方法
在Java中,受保护的成员可以访问子类和定义成员的包,另一方面,成员只对子类可见.
在您的情况下,代码可能是从实现A的类外部调用的(例如从工作表中) 如果要模拟Java行为,则可以使用表示法 protected[package_name] def g(i: Int) = println(i) 然后,方法g()将在包package_name中可见 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |