3

このようなことをする方法はありますか:

scala> trait Foo { def f:Int=0 }
defined trait Foo

scala> class FooImpl extends Foo { override val f = 1 }
defined class FooImpl

scala> class Bar(foo:Foo) extends Foo{ import foo._ }
defined class Bar

scala> (new Bar(new FooImpl)).f
res2: Int = 0

scala> trait Foo { def f:Int }
defined trait Foo

scala> class Bar(foo:Foo) extends Foo{ import foo._ }
<console>:8: error: class Bar needs to be abstract, since method f in trait Foo of type => Int is not defined
       class Bar(foo:Foo) extends Foo{ import foo._ }
             ^

scala> 

...インポートを介して親メソッドをオーバーライドするサブクラスになるような方法で?基本的にはタイピングせずにコンポジションを使えるようになれば面白いと思います。このようなことが可能かどうか、ただ興味があります。

4

2 に答える 2

3

あなたが本当に求めているのは、メソッドの実装をメンバーに委譲する方法です。

その問題はすでにここで対処されています: Proxies / delegates in Scala

基本的にはマクロを使って行う方法があります。実装はここにあります: https://github.com/adamw/scala-macro-aop

上記は、データ メンバーに適用できる @delegate マクロ アノテーションを提供し、コンパイラにコードを生成させて、メソッド呼び出しをそのメンバーに委譲します。マクロ注釈は Scala 2.11 で計画された実験的な機能ですが、Macro Paradise コンパイラ プラグインを使用して Scala 2.10 で使用できることに注意してください。

于 2013-09-21T00:58:13.927 に答える