在下面的代码中,我尝试使用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
谁能解释为什么会这样?任何帮助将不胜感激!谢谢!
答案 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