避免在scala中继承方法

时间:2012-04-26 21:02:47

标签: scala inheritance

以下代码段

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有没有办法实现这一目标?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:5)

因为您似乎不希望A with B 成为B,而是要访问{{1}的行为的子集这听起来像组合而不是继承的好例子:

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" 而没有A但有时需要能够在其上调用B方法,则可以使用隐式转化率:

bar