このページの記事一覧

2011年9月13日火曜日

同名のメソッドを持つトレイトのmixin

久しぶりの更新です、みなさん夏バテしてませんか?
残暑も厳しいざんしょ。
・・・

うん、Scalaの話ですよ。
ちょっとトレイト周りについて自分の整理がついていなかったんで簡単なコード組みながらあれこれしてたんですが、
いつもお世話になっている@hishidamaさんのサイトでミスを見つけたので、まとめがてら報告をば。

間違ってるのはここのsuper[]のお話。
同名のメソッドを持つトレイトをmixinする場合はオーバーライドが必要ですよ、とか、型パラメータ指定すると親のメソッド呼び分けられますよ、とか、そういった話なんですが。
最後に

これで同名メソッドを呼び分けることが出来るかも。と思ったが、
そもそもトレイト同士に継承関係が無い場合は同名メソッドがあるトレイトをミックスインすることは出来ない。



ってありますけど、これがダウト。やってみたらできました(バージョン間で異なる?試してません)。まぁエラーメッセージにも「出来ません」じゃなくて「overrideが必要です」って書いてありますね。



   1: trait A {
   2:   def f(): Unit = println("a")
   3: }
   4:  
   5: trait B {
   6:   def f(): Unit = println("b")
   7: }
   8:  
   9: class Hoge extends A with B {
  10:   override def f(): Unit = {
  11:     super[A].f()
  12:     super[B].f()
  13:   }
  14: }
  15:  
  16: val h = new Hoge()
  17: h.f()

ちなみにhishidamaさんのサイトではAはトレイトではなくてクラスとして宣言されてますが、Aをクラスにしても上記のコードはちゃんと動きました。


というわけでJavaでもScalaでもよく参考にさせていただいてるサイトですので、今後ともよろしくお願いします!