豊田 孝

サンプル・プログラムのダウンロードはこちら

 前回は,私たちの日常生活に密着させながら,クラス継承の意味を考えてみました。今回はいくつかの具体的な例を挙げながら,日ごろソフトウエア開発に従事しない“普通の人々”にとっての,クラス継承の意味とメリットを考えてみます。

 本稿を一読すると分かりますが,クラス継承を応用している例は,すでに私たちの生活の中にどっかり腰をおろしています。私たち“普通の人々”は,クラス継承の恩恵をすでに受けています。

 このため,“普通の人々”がソフトウエア開発の発注側に立った場合,クラスとクラス継承の意味を認識していれば,担当開発者とのコミュニケーションの質が向上することは間違いないといえるでしょう。これは発注する側である“普通の人々”にとっても,実際に開発作業をする開発プロジェクト・チームのすべてのメンバーにとっても,決して悪いことではないと思います。

 それでは,クラス継承について前回の復習も行いながら,具体的に説明していくことにします。

クラス継承の整理

図1
 図1[拡大表示]は前回も紹介したものですが,まずはこの図を眺めながら,クラス継承を説明することにします。図1は前回紹介したにもかかわらず,紹介しただけで通り過ぎてしまいました。一部の読者の方,とりわけ,実際にプログラミング作業をしている方々の間にはかなり不満が残ったのではないかと思います。

 オブジェクト指向開発方法論に精通している人々の中には,このクラス継承こそ技術的には,最大の魅力であり武器であると主張する人がいます。本連載はあくまでも,日常的にはソフトウエア開発に従事しない“普通の人々”に焦点を置いていますから,言語仕様に含められる専門用語(例えば,仮想関数や純粋仮想関数など)に言及することは好ましいことではありません。ここでは,“普通の人々”の視点から,この図の意味を次のようにまず整理し,説明することにします。

“「Person」というクラスから「Female」と「Male」という2個のクラスが作成されている。作成される2個のクラスは,Personクラスの性質を引き継ぐことができる。論理的には,1個のクラスから2個のクラスが生成できるため,開発効率がよいといえる。しかし,Personクラスの定義内容が粗末である場合(遺産相続に例えれば,借金目録など),多くのクラスに悪い影響を与える危険がある”

 Personは日本語では人間という意味があります。皆さんなら人間をどのように定義するでしょう。上に紹介した画面では,人間には名前(Name)と誕生日(Birthday)が必要と考えられ,それらを2つのプロパティとして定義しています。皆さんの中には,身長,体重などを追加したいと考える人もいるかもしれません。しかし,ここで重要なことは,開発効率を考える必要があるということです。つまり,必要な特徴のみを定義する必要があるということです。表現を変えれば,解決しようとしている問題に応じて,本質となる特徴を選択する作業が要求されるということです。

 ビジネス上不要な特徴をPersonクラスのプロパティとして定義している場合(ちょっと意味合いが異なりますが,遺産相続時の借金などはまったく不要ですね),そのプロパティはFemaleとMaleにもそのまま引き継がれ,後で不要な混乱を招く可能性も否定できません。

 一度定義したクラス内容は,一週間程度の期間はほとんどの人は忘れないかもしれませんが,半年後はどうでしょう。Personクラスから半年後に社員クラスを作成し,その社員クラスからまた営業社員クラス,管理職クラス,外回り社員クラスなどの多数のクラスを作成するようなこともありえないことではありません。ここで私が申し上げたいのは,クラスを定義するという作業は創造性とともに,ビジネスをよく理解する能力(分析能力)も必要とされる,ということなのです。OSやプログラミング言語知識はもちろん重要ですが,それ以前に,ビジネスの本質を理解する高い能力,専門的には,問題領域の分析能力,がきわめて重要であるといえます。

 以上で上記図の説明は終了です,と幕を閉じたいところですが,実は先ほど説明したことはクラス継承のほんの一面でしかないのです。まず,上記説明ではメソッドが抜けています。さらに“クラス継承を使う上での柔軟性(遺産相続でいえば,負債部分の取り扱いなど)”という側面も一切言及されていません。それではこの2点について,通常はソフトウエア開発業務に従事しない“普通の人々”の視点から考えてみることにします。

クラス継承とメソッド

図2
 先に紹介したPerson,Female,そしてMaleという3種類のクラス持つ図では,メソッドが1つしかありません。プロパティはクラスの属性を表現するデータであることはすでに説明したところです。メソッドは一般には,データに対して,それを操作する機能などといわれたりすることがあります。ここでは常日ごろ親しんでいるファイルというクラスを例にとって考えてみましょう。図2[拡大表示]を見てください。

 私は通常Windows 2000を使用していますが,そのWindowsによって管理されている特定のファイル上でマウスを右クリックすると,図2のような画面が表示されます。ご覧のように,プロパティという用語が最下端に表示され,残りは該当ファイルを操作するための機能が紹介されています。これは単純な情報ですが,しかし,この情報は,Windows 2000開発にはオブジェクト指向開発方法論が採用されていることを強く示してくれています。

 ファイルは多数のメソッドとプロパティを持っています。それでは,冒頭に紹介した人間クラスに新しい操作機能(メソッド)を追加する場面を想定してみましょう。まず注意すべきことは,操作はあくまでもプロパティの操作であるという視点が重要です。クラス内のデータを操作するために,メソッドを用意するという発想です。このため,冒頭に紹介した図のように,人間クラスが名前と誕生日というプロパティを持っている場合,名前と誕生日というデータを読み書きするための操作を用意する必要があります。先の図では,Ageというメソッドが用意されています。ここまではよろしいですね。

 ところが,これは私の独り善がりかもしれませんが,私には「女性に対して年齢を尋ねるのは無礼である」という認識があります。すると,人間クラスに誕生日データあるいは年齢を読み出すメソッドを定義し,そのクラスから女性クラスを作り出している場合,定義したメソッドは女性クラスにそのまま継承されてしまいます(上の図ではAgeメソッドがPersonクラスに定義されているため,Femaleクラスにそのまま継承される)。

 人間クラスから女性クラスを作り出し,この女性クラスから社員クラスを作り出している場合,誕生日や年齢データを読み出すメソッドの機能を無効にしたい,という場合を考えてみましょう。このような場面では,人間クラスから女性クラスを作り出す過程で,誕生日や年齢データを読み出すメソッドを修正することができます。クラスを再定義する必要はありませんし,この修正作業はプログラミング時も可能です。このようなプログラミング手法は,一般には,オブジェクト指向開発方法論に対して,オブジェクト指向プログラミングと区別して呼ばれたりしているようです。人間クラス内の誕生日あるいは年齢読み出しメソッドを,“まさに青春です”などのしゃれた文字列を表示するメソッドに変更することができます。この変更処理を専門的には,メソッドのオーバライド(上書き)と呼んでいます。

 すでに紹介したメソッドのオーバーライドに加えて,プロパティとメソッドの追加作業をクラス継承時に行うこともあります。これは,クラス継承を通して新規に作成するクラスに対して,必要となったデータと操作のみ(差分)を,追加するという意味があります。このため,差分プログラミングなどと呼ばれることもあるようです。オブジェクト指向プログラミングに関するより詳細については,一般に市販されている関連図書を参照されてください。

クラス継承の具体例としてのInternet Explorer(IE)

 それでは最後に,Internet Explorer(IE)をクラス継承という角度から眺めてみましょう。ご承知のように,マイクロソフトのIEは短期間でバージョンアップを繰り返し,高機能化されてきました。現在の最新バージョンは5.5ですが,一部の気の早い方はすでに6.0bというバージョンを使用されているのではないでしょうか。しかし,私を含む普通の人々は,次のような素朴な疑問を持っているのではないかと思います。

“Microsoftはなぜあれほどの短期間でバージョンアップを繰り返せるのだろう”

 この問いへの回答は,クラス継承という角度から探し出すことができます。ちょっと難しい情報になってしまいますが,IEの内部には次のような情報が含まれています。

interface IWebBrowser;
interface IWebBrowserApp;
interface IWebBrowser2;

ここではinterfaceという単語は無視し,IWebBrowser,IWebBrowserApp,IWebBrowser2という3個のクラスが用意されていると考えてください。クラス名から次のようなことが推測できないでしょうか。

“IWebBrowser2クラスは,IWebBrowserクラスの性質を継承してできあがったクラスではないか”

実はそのとおりなのです。内部情報を調べてみると,まず,IWebBrowserクラスを定義し,次にこのクラスの性質を引き継ぐIWebBrowserAppクラスを作成し,最後にIWebBrowser2クラスを作成しているのです。このため,IEの機能は次のように分解できます。

・IWebBrowserクラス定義情報から判断すると,IEはインターネット上で公開されるWebページを閲覧する機能をもっている(例:ナビゲーション機能を提供するNavigateメソッドや直前の閲覧ページに戻るGoBackメソッドなど)。この機能はバージョンの古いIEにも実装されている。
・IWebBrowserAppクラス定義情報から判断すると,IEはWindowsアプリケーションとしての機能も持っている(例:ウィンドウハンドルを返すHWNDメソッドなど)。
・IWebBrowser2クラス定義情報から判断すると,最新機能を持っている(例:ナビゲーション機能を提供する新しいNavigate2メソッドなど)。

ここで,次のような質問を投げかける人がいるはずです。

“クラス定義情報を調べる方法とは何か”

この問いへの回答は次回紹介したいと思います。

今回のまとめ

 今回はクラス継承を取り上げました。本文でも触れたように,クラス継承は問題領域の分析とクラス定義などのいわゆる開発上流と,下流に位置するプログラミング段階でも重要な意味を持ちます。本連載内容が今後の学習を進める上でのきっかけになれば,この上ない喜びです。

 次回は,オブジェクト指向開発という角度からマイクロソフトのバージョンアップ戦略を眺めながら,IT時代を生き抜くための私たちのあり方などを考えてみたいと思います。明日またお会いしましょう。ごきげんよう。