实例化类中的特征时出错(方法变为私有)

时间:2018-07-20 20:30:42

标签: scala access-modifiers anonymous-inner-class

在下面的代码中,我尝试使用Decorator类实例化特征A并向其中添加方法p,以便获得具有{{1} }方法:

p

但是当我尝试致电trait A { def x: Int } case class Decorator(a: A) { def withPrint: A = new A { val x = 100 def p: Unit = println(x) } } val a = new A {val x = 100} val d = Decorator(a).withPrint 时,它会提示错误

  

值p不是A $ A54.this.A

的成员

然后我在d.p中打印声明的方法,我发现d私有

p

谁能解释为什么会这样?任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

def p没有公开的理由。您是在本地匿名类中定义的一种方法,该方法实现特征A。特征A仅声明公共方法x,而没有其他声明。因此,您可以访问p的唯一作用域是new A { ... }的初始化程序内部,因此private似乎适合于此。

如果要公开方法p,则可以将其添加到A中(然后您必须在此处实现它,然后也不需要withPrint方法),或者混入其他保证方法p存在的特征。例如:

trait A {
  def x: Int
}

trait Print {
  def p: Unit
}

case class Decorator(a: A) {
  def withPrint: A with Print = new A with Print {
    val x = 100
    def p: Unit = println(x)
  }
}

val a = new A { val x = 100 }

val d = Decorator(a).withPrint

d.p