実際の継承の例

実際の継承の例

 図2-1はJavaのインタフェース定義で、文字列を返すメソッドdescriptionだけからなるDescriptionというインタフェースを定義しています。図2-2はこのインタフェースを採用するクラスFaceの定義、図2-3はクラスTimeOfDayのJava版で、コンストラクタで時刻の設定ができます。図2-4はクラスTime12の定義で、スーパークラスとしてTimeOfDayを継承すると同時にインタフェースDescriptionを採用しています。

 このように定義したクラスFaceとクラスTime12の間には直接の継承関係はありませんが、どちらもインタフェースDescriptionを採用しています。インタフェースは実装を伴わないため、それぞれのクラスでメソッドdescriptionを実装しなければなりません。

 この2つのクラスを使った例を図2-5に示します。Javaではインタフェースを型として指定できます。Time12、Faceの各インスタンスもメソッドdescriptionのみを使う限りはDescription型の同じ変数に代入して扱えます。通常の継承関係と同様に、ポリモーフィズムの恩恵にあずかれるわけです。実行例は図2-6の通りです。

デリゲート

 インタフェース継承で継承されるのはインタフェースのみなので、それぞれのメソッドは各サブクラスで実装する必要があり、今度は実装コードの共有が難しくなるという問題が発生します。この問題を軽減する方策の1つとしてデリゲートの考え方を紹介します。

 デリゲート(またはデリゲーション)は日本語では「委譲」などの訳語が当てられることがあります。あるオブジェクトがメッセージを受け取った時、その処理を別のオブジェクトに任せる仕組みや手法がデリゲートです。

 簡単な実現として、インスタンス変数で別のオブジェクトを参照するようにしておき、必要に応じてそのオブジェクトに処理を依頼する方法が考えられます。原理的にはこれで十分です(図2-7)。そのほか、言語システムの機能を利用して、インタフェースで決められたメソッドの処理を一括して任せる方法や、自身が処理できないメッセージをすべて転送する方法なども考えられます。

 継承もデリゲートも、対応できない処理を別の個所の実装に任せるという点では同じです。しかし、継承関係はプログラムを記述した時に決まるので、サブクラスで定義されていない操作が求められると、常に同じスーパークラスのメソッドで処理が行われます。デリゲートの場合、委譲先となるオブジェクトを変更することで、処理内容を動的に変更することができます。

 例えば、ウィンドウを表すオブジェクトにデリゲートを指定できるようにしておき、ウィンドウサイズの変更、クローズなどの処理を任せれば、継承を行うことなく、常に正方形を保つウィンドウの実現や、クローズ時の確認パネル表示が可能になります。

 なお、C#にデリゲートというメカニズムが備わっていますが、これは関数ポインタを抽象化したものと見なすことができ、メッセージの転送という意味合いは薄れています。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30