Software Engineering Lecture 9/4

Software Engineering Lecture 9/4

単一継承と多重継承

オブジェクト指向プログラミングでは、プログラムの再利用という ことが言われる。これは実際のプログラム技術としては、継承という メカニズムを使って行なわれる。 このメカニズムには、大きく分けて二つの方法がある。一つは、継承できる class は一つしか無いというものであり、もう一つは、複数のclassを継承する ことを許す方法である。

単一継承では、プログラムのコードの共有は単純であり再利用は上位のclass の変更と言う形で行なわれる。個々のメソッドの基本的なものは上位のclass で決めるのが普通である。これを逆に利用して、上位のclassにはわざと実装を 記述しないと言う方法もある。このようなclassを抽象class (abstract class) という。これは、このclassを継承するオブジェクトに必要なプロトコルを 規定していると考えることもできる。 単一継承にはインスタンス変数のオフセットを簡単に決めることができるという 実装上の利点もある。



多重継承では、個々のclassを部品として構成することが多い。必要な 部品を集め、それぞれの機能を利用してプログラムを作りあげる。この 方がコードの再利用率は高くなる。その一方で、それぞれの部品の整合性を 取ることは難しくなる。また、単一継承の場合と異なり、インスタンス 変数のオフセットを単純に決めることができない。また、多重継承は、 インスタンス変数に部品となるオブジェクトを格納しておき、必要な時に、 そのオブジェクトに処理を委託するという方法で実現することもできる。 これは委譲(delegate)と呼ばれる。



多重継承でも抽象クラスを使うことができるが、抽象クラスの役割だけを、 取りだす方法もある。これはインタフェースとかプロトコルと呼ばれることが 多いようである。例えば、単一継承のシステムで、受け入れられるメソッドの 種類だけを記述する記述法を用意して、自分が使う変数に対して、インタフェース を指定するというように使う。

問題

ファイルに対する操作には、block I/O, sequential I/Oがある。Unix では、それらは、write/read と seek によって実現される。また、 これに対してbuffering を使った、fwrite, fread, fgetc, fputc、 そして、入出力をstdioに限定した、getchar, putchar がある。 これらをclass として実現するとしよう。可能な多重継承に よる構成と、単一継承による構成を考えて、それぞれの利点と欠点に ついて考察せよ。