以下代码段
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有没有办法实现这一目标?
答案 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