ビジネス WinDbgアプリケーション開発技術 Windowsカーネルと型


私たち人間のために用意された"抽象型"

 「C++プログラミング言語の歴史と特徴」連載第18回目の今回も前回に引き続き次の公開論文を精読していきます。

第1回連載資料論文

 今回は、「4.2 Abstract Types」節の意味を考えます。Abstract Types(抽象型)はAbstract Classes(抽象クラス)と表現することも可能です。C++言語へのAbstract Typesの採用は大変困難なものであったようです。Stroustrup氏がAbstract Typesを考え出したとき、周囲の人はそれを理解できなかったようなのです。当時、Barbara Moo氏(このような書籍を書いている著名な方)がAbstract TypesをC++に導入すべきだ、と主張し、Stroustrup氏を支持してくれました。Moo氏の支持表明がなければ、私たちはAbstract Typesを利用できなかったかもしれないのです。Stroustrup氏は、「The Design and Evolution of C++」書籍の中で、Abstract Typesを次のように定義しています。

定義1:インターフェイスを表現する型である
定義2:インターフェイス定義とオブジェクト定義という2つの異なるクラスの役割の混乱を取り除く
定義3:インターフェイスと実装を別々に設計できるようにする

 プログラミング学習を始められて間もない方や、オブジェクト指向ベースの開発プロセスに興味のない方にとっては、もしかすると、これら3つの定義文の意味は、理解することはおろか、想像すらできないでしょう。次の点だけは頭の隅に残しておくと今後何かと便利です。

 "これら3つの定義文は、オブジェクト指向ベースソフトウェア開発の本質の定義である"

 定義1と3は、現代ソフトウェア開発全般で重視されています。Javaと.NETはこの2つの定義に沿って開発された実装事例です。定義1と3は他の連載で必要に応じて触れることにし、本日は定義2について考えてみたいと思います。

 定義2文内では、「インターフェイス定義」と「オブジェクト定義」、という2種類の用語が使われています。前者は「すべての人に適応できる一般原則を定義」するためのクラス、後者は「ある人だけに適応できる固有なデータを表現」するためのクラス、とそれぞれ表現しなおすと分かりやすいと思います。インターフェイス定義は、あくまでも「一般原則の定義」ですから、具体的なデータを必要としません。一方、オブジェクト定義は、「固有なデータの表現」ですから、具体的なデータを必要とします。

 私たちは小学生時代、家路に着きながら、"今日遊べる?"と友達に声をかけたりしました。声をかけられた友人は、"遊べる。何して遊ぼうか?"と応じたものです。"校庭でドッチボールはどう?"。"そうしよう。他に何人か呼ぼうよ!”。

 このように計画は次第に具体化されたものです。この具体化プロセスを冷静に分析してみると、"楽しく時間を過ごすこと"がまず確認され(「一般原則の定義」)、次に、"多くの友だちと校庭でドッチボールをすること"(「固有データの表現」)といった具体的な内容が決められていきます。一般原則というのは、どこでも通用する取り決めですから、具体的なデータを持つクラスではなく、専門的には、抽象クラスやインターフェイスと呼ばれます。

 ところが、"多くの友だちと校庭でドッチボールをすること"という部分は、かなり具体的な情報を含んでおり、どこでも通用する原則というものではありません。私たち大人は、小学校の校庭に入ることは基本的には許されていません。"午後ドッチボールをする"、という発想も私たち大人にはないでしょう。ここまで読み進めてくると、一般原則を考える作業と自分たちを具体的に表現する作業は大きく異なっていることがお分かりになると思います。ところが、この2つの作業には、"クラスが使える"という「共通性」があります。結論を急げば、この共通性こそオブジェクト指向(クラス階層)の本質なのです。物事の共通性と個々の物事の固有性を表現するために(専門的には、汎化と継承・特化と呼ばれています)、C++は次のような概念を便宜的に導入しました。

virtual void playball(int opt) = 0; // 一般原則の定義
virtual void playball(int opt) {}; // 一般原則の具体化(場面に応じて修正可)
void playball(int opt) {}; // 一般原則の具体化(修正不可)

 これらはすべて関数ですが、異なる名称が与えられています。上から、純粋仮想関数、仮想関数、通常関数、と呼ばれています。Abstract Type(あるいは、Abstract Class)という場合、その内部に1個以上の純粋仮想関数を持っていなければなりません。技術的にはかなり難しいのですが、私たちの日常的な経験を振り返るだけで、C++の技術概念は説明できてしまうものなのです。またそのように作られているのがプログラミング言語C++といってもよいのです。

 正直今回の内容は難しかったと思います。一度読んだだけでは、おそらく、理解できないと思います。後日お時間のあるとき、お手持ちのC++入門書の「抽象クラス」を取り上げている章や節と併読してください。おそらく、これまでとはまったく異なる視点から読み解くことができると思います。

前へ | 次へ



 WinDbg入門  ホーム


Copyright©豊田孝 2004- 2009
本日は2009-01-07です。