ポリモーフィズム

 さて、いよいよ「ポリモーフィズム」のお話です。
ポリモーフィズムなんて、聞いたこともないような単語です。
難しそうですね。

ポリモーフィズム(polymorphism)の“poly”は、ポリゴンの“ポリ”です。
直訳すると、「多形、多形性」などの言葉に訳されます。
オブジェクト指向プログラミングの用語では、「多態性」と呼ばれるようです。

多態性というのも難しい単語です。
でもまぁ、はじめから専門用語がわかる人はいません。
臆することなく進めてゆきましょう。

目次

  1. 目的は?
  2. Object 型とポリモーフィズム
  3. Implements ステートメント
  4. 中間まとめ
  1. 抽象クラス
  2. Implements とインターフェイス
  3. Implements とポリモーフィズム
  4. まとめ

目的は?

 “多”という文字から察するに、ポリモーフィズムは、複数のクラスを利用するプロジェクトにおいて有効な技術です。比較的規模の大きなプロジェクトや、コンポーネントの作成現場などで見られます。

極端にまとめて言えば、ポリモーフィズムとは、“同種のクラスをカテゴリに分類してまとめ、基本的な動作・設計部分を統一することで、オブジェクトインスタンスの扱いに柔軟性と規律を持たせるための機能”です。

まだ難しいですね。
何をするものなのでしょうか?

Object 型とポリモーフィズム

 ポリモーフィズムは、「Object 型」に関連しています。

Object 型の性質は、引数にオブジェクトを得るようなプロシージャにおいて、時として便利な場面があることです。

Public Sub Add(ByRef NewItem As Object)

End Sub

 このように、変数や引数を As Object として宣言すれば、クラスの型を気にせずに何でも代入することができます。

しかしこの“何でも入る”ことが逆に、Variant や Object 型のデメリットでもありました。

ポリモーフィズムは、複数の似ているクラスたちをひとつのカテゴリにまとめることで、この“何でも入る”を、“○○のカテゴリに属するオブジェクトなら入る”と、定義範囲を狭め、Object 型のデメリットを取り除き、メリットだけをうまく生かそうという目的のものです。


 たとえば、次のようなことが可能です。

→ これらは Item というカテゴリに分類される(と定義する)

'ItemList.cls
Public Sub Add(ByRef NewItem As Item)

    'Item というカテゴリに分類されているものなら、
    'Sword 型も、Armor 型も、Ring 型でも代入することができる

End Sub
    Dim theSword As Sword
    Set theSword = New Sword

    Call ItemList.Add(theSword)
    'Sword 型のインスタンスを代入しようとしている
    '通常なら実行時エラーになるが、
    'ポリモーフィズムのおかげでエラーにはならない

As Object とした場合とほぼ同等の効果を得られる上、事前バインディングでコンパイルされるため、As Object よりも高速に処理できます。また、Item に属さないクラスインスタンスを代入しようとすると、エラーになります。

Implements ステートメント

 具体的には、この“カテゴリにまとめる”という作業は、Implements ステートメントによって行います。

上の例で説明すると、Sword, Armor, Ring の各クラスの General セクションに、

Implements Item

というコードを書き加えることで、そのクラスが Item に属していることを定義できます。

 この、カテゴリ名として指定している“Item”もクラスです。
プロジェクトにクラスモジュール Item を追加してから Implements を記述すると、構文補完のリストに Item が表示されます。

画面写真(Implemtes ステートメント)

中間まとめ

 ポリモーフィズムを応用する実際の目的は、この“オブジェクト変数に入るインスタンスに幅をもたせること”です。

As Item として定義すれば、格納できるインスタンスは基本的に Item オブジェクトのみです。そこに、Implements ステートメントが、自分の身分を証明する方法を与えてくれたので、Sword も Armor も「自分は Item クラス(の一員)である」と主張し、結果として見事、Item 型の変数に入ることができるのです。

しかし、Implements ステートメントの本来の役割は、別の意味にあります。
身分を証明するために最低限やらなければならないこともあります。

2000年12月13日(水) 更新