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本当にになりたいのBではなく、 の動作のサブセットにアクセスしたいように見えるので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は、暗黙的な変換を使用して実行できます。

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 に答える