加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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中可见

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读