ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。トレイト(2)Scalaスポンサーリンクちょっと間が空いたけど、再びScalaの勉強に取り組んでいく。前回のScalaネタ最後にまだこの章は続くのだけど、今日はここまで。www.tech-diningyo.infoと書いた。今日はトレイトの章の残りを見ていく。Scalaではトレイトを使うことで、実質的には多重継承を行うことが出来る。資料には以下のようにシンプルな例が示されている。}}上記の例では、TraitAを継承したTraitB/TraitCでメソッドgreetを実装している。このTraitB/TraitCを同時に継承したClassAを作ると以下のようにエラーが発生する。TraitB/Cでメソッドgreetの実装が存在しており、この2つのTraitを継承してしまうとどちらのgreetを使うのかが一意に決まらなくなることが原因となる。これが菱型継承問題だ。foundoverrideによるメソッドの上書き上記のNoteにあるようにScalaではClassAでoverride指定を行うことでこの問題を回避できるらしい。いうことでやってみる。greet()として実装を上書きして実行してみると、上記のようにClassAで実装した動作となる。TraitCの処理を使用したい場合もあるはずでその時のためにsuper[]を使ってどちらのTraitの処理を使うかを明示的に指定することが出来る。実際にコードを書き換えてTraitBの処理を呼び出してみる。このsuperを使う感じはpythonと一緒だな。}}実際に実行してみるとエラーがもなく実行することが出来て、結果もsuperで指定したTraitBの処理が実行される。}}結果は以下の通り。Evening線形化(linearization)前項のようにsuperを使うことで明示的に継承元のメソッドを呼び出すことが可能だ。継承関係が複雑になった場合、それらを全て把握して明示的に処理をすることが大変になってくる。Scalaでは線形化という機能を使うことでそれを解決することが出来るらしい。資料によると線形化とはScalaのトレイトの線形化機能とは、トレイトがミックスインされた順番をトレイトの継承順番と見做すことです。わからんので例を見ていく。}}上記は前項で多重継承でエラーとなる例に少しだけ手を加えたものだ。変更点は一つで継承して作ったTraitB/TraitCのgreetメソッドにoverrideをつけただけになる。これを実行してみよう。Evening今度はエラーにならずに実行できた。結果としてはTraitCのgreetメソッドが表示されている。これだけだと、あんまりメリットがわからないので、上のコードをまた少しいじってみよう。}}追加したのはClassBの定義のみでClassAとの違いはextendsにTraitCを指定してwithにTraitBを指定したことのみであるが、このコードを実行すると以下のようになる。Morning見てのとおりだが、継承の順番によって実行されるgreetメソッドが異なっている。説明としてはこれはトレイトの継承順番が線形化されて、後からミックスインしたTraitCが優先されているためです。指定する順番によって継承順が一意に決まる(=線形化する)とのことであとからミックスインしたTraitCが優先されることになる。superを使うことで線形化された親トレイトを使うことも可能。・ิω・ิ)と資料の内容をそのまんまパクってみたけど、どういうことか理解できなかったので資料のサンプルの他に追加してTraitDとそれを使ったClassCを作ってみたものを実行すると以下のようになった。Evening結果をまとめると以下の感じだろーか。Morning"が出力されない。Trait)と呼ぶことがあります。長くなったので、トレイトはもう一回使って見ていくことにして今日はここまで。トレイト(1)今日はトレイトの章を。オブジェクト今日はオブジェクトの章を。クラス今日はクラスの章を。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。