3

下面的代码片段

class A {
   def foo = "A.foo"
}

trait B {
   def foo = "B.foo"
   def bar = "B.bar"
}

val x = new A with B

不编译,因为

error: overriding method foo in class A of type => java.lang.String;
method foo in trait B of type => java.lang.String needs `override' modifier

但是,我的意图是定义 x 以便:

x.foo => "A.foo"
x.bar => "B.par"

也就是说,我只希望 x 从 B 继承 bar,而不是 foo。有没有办法在 scala 中实现这一目标?

4

2 回答 2

12
scala> val x = new A with B { override def foo = super[A].foo }
x: A with B = $anon$1@4822f558

scala> x.foo
res0: java.lang.String = A.foo

scala> x.bar
res1: java.lang.String = B.bar

这显然不是你想要经常做的事情。

于 2012-04-26T21:26:30.353 回答
5

由于您似乎并不是真的想A with B成为aB而是想要访问 a 行为的子集B,这听起来像是组合优于继承的一个很好的例子:

class A(val b: B) {
   def foo = "A.foo"
   def bar = b.bar
}

class B {
   def foo = "B.foo"
   def bar = "B.bar"
}

val x = new A(new B)
x.foo => "A.foo"
x.bar => "B.bar"

或者,如果您大部分时间都需要一个AB有时需要能够调用bar它的方法,您可以使用隐式转换来实现:

class A {
  def foo = "A.foo"
}
class B {
  def foo = "B.foo"
  def bar = "B.bar"
}

implicit def a2b(a: A) = new B

val x = new A
x.foo => "A.foo"
x.bar => "B.bar"
于 2012-04-26T21:08:40.483 回答