Scala で、クラス A と B が共通のメソッドを持っているが、共通のインターフェースを継承していないとします。
class A {
def foo() {
println("A.foo")
}
}
class B {
def foo() {
println("B.foo")
}
}
私がやりたいことは、foo()
メソッドを持つクラスを拡張する特性を定義することです。私はこれを試しました:
type Fooable = {
def foo()
}
trait Q extends Fooable {
override def foo() {
println("before super.foo")
super.foo()
println("after super.foo")
}
}
(new A with Q).foo()
(new B with Q).foo()
ただし、Scala コンパイラはこのコードをエラーで拒否します。
error: class type required but AnyRef{def foo(): Unit} found trait Q extends Fooable {
最善の解決策は、共通のメソッドを含むインターフェイスを作成し、クラス A と B を変更してインターフェイスを継承することです。残念ながら、これらのクラスを変更することはできません。これは、次のような Java ライブラリで一般的です。
java.sql.Connection.close()
とjava.io.Closeable.close()
android.app.Activity.onDestroy()
とandroid.app.Service.onDestroy()