継承は難しい概念だが、実際のプログラミングで使う継承の機能は限られている。まずは、これだけをマスターしておこう。
今回は「継承」について学んでいきます。継承はオブジェクト指向プログラミング(以下、OOP)のトピックの中でも、最も難易度の高いものの1つです。しかし、多くの一般的なWindowsアプリケーションやWebアプリケーションをプログラミングする場合においては、継承を使いこなすことを不安に思う必要はありません。なぜなら、わざわざ継承を使わなくてもたいていのプログラミングはできますし、よく用いられる継承の「パターン」も限られているからです。
しかし、ビギナーであっても継承について一通りの知識は必要となります。それは、.NET Frameworkのクラス・ライブラリで継承が多く使用されているためです。クラス・ライブラリは、アプリケーションを作るうえで欠かせないものであることはいうまでもありません。継承について知っていなければクラス・ライブラリを使いこなすことは不可能です。
本稿では、よく使用される継承のパターンをマスターし、継承を用いて構築されている.NET Frameworkクラス・ライブラリを読み解けるようになることを目標に、継承について解説していきます。
さっそくですが、OOPにおいて継承とは「既存のクラスをベースとして、新しいクラスを定義する」ことです。ベースとなるクラスは「基本クラス」と呼ばれます。基本クラスをベースとして新しく定義するクラスは、基本クラスから派生しているため「派生クラス」と呼ばれます*1。
*1 英語では「基本クラス/派生クラス」は「Base Class/Derived Class」と呼ばれます。また、「親クラス/子クラス」、「スーパー・クラス/サブ・クラス」などと記述される場合があります。
本連載の第2回では、独自のFormクラスを定義し、そのクラスからオブジェクトを作成しました。また、第3回ではクラス・ライブラリのFormクラスからオブジェクトを作成しました。
今回は、クラス・ライブラリにあるFormクラスを継承した新しいクラス(派生クラス)を作成し、オブジェクトを作成します。この場合、派生クラスにとってはFormクラスが基本クラスとなります。
クラス・ライブラリのクラスをベースとして新しいクラスを定義するというこのパターンが、(OOPビギナーにとって)最も頻繁に利用する継承のパターンといえるでしょう。
実際には、クラス・ライブラリにあるFormクラスは、同じくクラス・ライブラリにあるControlクラスを継承して作られています。アプリケーションを作成する場合には、このようなクラスの階層を知っている必要があります。
以上のことをマスターしたとすると、次にくる継承のパターンは、基本クラスとなるクラスをまず作っておき、その派生クラスからオブジェクトを作るという方法になります。独自のクラス・ライブラリ構築もこのパターンといえます。また、いまはやりの「デザイン・パターン」にある多くのパターンで、この継承のパターンが使われています。
しかし、このパターンのようなクラスとクラス階層の設計には十分なOOPの経験が必要であり、一朝一夕にマスターできるものではないため、このパターンについては本連載ではほとんど触れません。ただ、このようなクラス階層を自分で構築する場合には、図5のようなクラス・ライブラリにあるクラス間の親子関係が手本になります。クラス・ライブラリは単にAPIとしてではなく、継承をはじめとするさまざまなOOPSテクニックの手本としても使えるということです。
さて、クラスがpublicであれば、それを基本クラスとして、派生クラスを定義することができます。前回では、クラス・ライブラリにあるpublicなクラス「Formクラス」を使用して、Windowsアプリケーションを作成しました。ここではまず、このFormクラスを派生させて、NewFormクラスを定義してみましょう。
派生クラスを定義するときには、クラスの定義時に、基本クラスとなるクラスを「:」(VB.NETの場合には「Inherits」)により指定します。
VB.NETの場合の「Inherits」は「〜を継承する」という動詞です。最後の「s」は三人称単数の「s」です。「NewForm Inherits Form」と英語の文章になっているところがVB.NETの面白いところです。ただし、なぜかInherits……は改行してから記述しなければなりません。
上記のNewFormクラスは、そのメンバとしてメソッドやプロパティを何も記述していないので、まったく何もできないクラスのように見えますが、実は、基本クラスであるFormクラスからすべてのメンバ(ただしコンストラクタは除く)をそっくり受け継ぎます。つまり、すべてのメンバを継承しているわけです。これが、継承が継承と呼ばれるゆえんです。
継承により、NewFormクラスはFormクラスのすべてのプロパティやメソッドを実装しているように見えますし、実際、Formクラスのオブジェクトに対してそれらが呼び出せたように、NewFormクラスのオブジェクトに対しても呼び出すことができます。
つまり、このNewFormクラスを利用する次のようなプログラムが記述できるわけです。
このプログラムは、前回で示したコードの「Form」と「myForm1」の部分を、「NewForm」と「myNewForm1」に書き換えただけです。
Copyright© Digital Advantage Corp. All Rights Reserved.