Part22: デリゲート

ことり「今回はデリゲートの話をします」
凛「デリゲート?」
ことり「日本語だと委譲なんていうけど、継承の欠点を補うために考案されたデザインパターンの1つ、ってところかな。いい感じの参考資料として」

Effective Java 16章「継承よりコンポジションを選ぶ」

ことり「この辺、読んでみるといいかも。出典はEffective Javaだね」

ことり「ある処理を行うオブジェクトを他のオブジェクトに渡しておいて、その外側のオブジェクトは操作を内包するオブジェクトに委譲する、ってとこかな」
凛「いまいちピンとこないにゃ」
ことり「じゃあ・・・」

ことり「こんなコードを考えます。役者さんのActorインターフェイスと、それを実装した声優さんのVoiceActorクラスがあります」
凛「なんかメタな話が始まったにゃ」
ことり「わたしたちCharacterは、ファイナルでナンジョルノが言ってたように1枚の紙の上に描かれた女の子に過ぎません。そこで、誰かに声を吹き込んでもらうんです」
凛「それでActorをコンストラクタで受け取るんだね」
ことり「それで担当声優が決まるんです。mainを見ると、穂乃果ちゃん役をえみつんが担当することになるね。さて」
凛「うん。なんでhonoka.act()ができるのか、だよね」
ことり「そう。Characterは自分でact関数を定義してるわけじゃないのに、ちゃんと演技ができちゃいます」
凛「たぶん、えみつんのactが実行されてるんだと思うにゃ」
ことり「正解。穂乃果ちゃんの得意技、丸投げが実行されているの。Characterの定義のby actorによってね」
凛「つまり、キャラクターに対する操作は、その担当声優が肩代わりすることになる、と」
ことり「byを使うと、そのクラスのインスタンスに対する操作は自動的にコンストラクタの引数で与えられたオブジェクトに委譲されるようになります。ひとつひとつ関数を実装する必要はないんだ」


ことり「今見たのはクラスの委譲。他にも、プロパティの委譲もサポートされています」

ことり「これもCharacterからVoiceActorに委譲するパターンで、キャラクターのキャスト名のプロパティを委譲してます」
凛「これもby actorだけでできるの?」
ことり「VoiceActorの実装にあるように、getValuesetValueが必要だよ。関数のシグネチャはサンプルコードの通り」
凛「ふんふん、これでhonoka.castでえみつんの名前が取れるし、honoka.cast =・・・えーと、あー、うー」
ことり「姓は変わるかもしれないし♪」


ことり「基本的なデリゲートはこんなところです」
凛「デリゲートって何か、が分かっていれば、書き方は難しくないにゃ!」
ことり「むしろJavaより簡単に書けるようになってるんだよ」

ことり「次回は、公式ドキュメントだと最初の方に出てきてるんだけど、パッケージについて見てみます」
凛「どうしてここまで引っ張ったの?」
ことり「関数とかクラスとかを一通り押さえた上でやった方が分かりやすいかなって」
凛「公式ドキュメントってJava知ってる前提だもんね・・・」


LINEで送る
Pocket


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です