多態性とは
この節の要点
- 継承した子クラスオブジェクトを親クラスオブジェクトとして扱うことができる言語機能を使って、どんな子クラスオブジェクトでも1つの親クラスオブジェクトの処理としてまとめることができる性質を多態性と呼ぶ。
オブジェクト指向プログラミング言語において、継承関係にあるクラスのオブジェクトは上位クラスのオブジェクトとして扱うことができます。
このようなある型(クラス)から生成されたオブジェクトを、本来の型(クラス)ではない別の型(クラス)のオブジェクトとして扱うことを型キャスト と呼びます。例えば、C言語などでは、ある型から別の型にキャストをする際に、図1のように明示的にキャスト演算子、ここでは(int)を使う必要があります。
float fx = 1.5;
int ix = (int)fx; // float型をint型としてキャスト
Javaにおいて、スーパークラスと継承関係にあるサブクラスには、代入互換性(Assignment compatibility)があります。この代入互換性とは、キャスト演算子を使うことなく別の型に代入することができる性質です。 つまり、スーパークラスの変数にサブクラスのオブジェクトをキャスト演算子なしで代入することができます。型キャストすることで下位の概念を上位の概念として扱うことができるわけです。
ここで、上位の概念(スーパークラス)の振る舞いは下位の概念(サブクラス)でも同様に再現できるはずですが、下位の概念を上位の概念として捉えた時、その振る舞いは下位の概念のごとに異なるはずです。
例えば、自動車という概念は、軽自動車やスポーツカーなどの下位の概念を持ちます。ここで自動車の概念には、下位の概念を包括する振る舞いが存在するはずです。例えば、図2に示すように、ドアを開ける振る舞いであったり、エンジンを動かす振る舞いなどです。これら振る舞いは、軽自動車やスポーツカーなどの下位の概念が与えられた際には、下位の概念ごとの個別の振る舞い(ドアの開け方であったりエンジンの動かし方は下位の概念ごとに異なるため)に依存しています。

すなわち、プログラム的には、サブクラスのオブジェクトをスーパークラスのオブジェクトとして扱った際に、スーパークラスのメソッドを実行すると、サブクラスの実装が反映されたメソッドが実行された方が自然です。
図3に、具体例を示します。図3は、ユーザデータを表すUserクラス(第4週の図18参照)を継承した教員データを表すTeacherクラスの例です。Teacherクラスにおいては、getUserNameメソッドにて名前文字列を取得する際に、役職文字列を追加する拡張を行っています。
public class Teacher extends User {
private String role;
public Teacher(String role, String familyName, String firstName) {
super(familyName, firstName); // スーパークラスのコンストラクタ呼び出し
this.role = role;
}
@Override
public String getUserName() {
return this.role + super.getUserName();
}
}
public static void main(String[] args) {
Teacher t = new Teacher("Prof.", "Yukawa", "Hideki");
User u = t; //Teacher型(サブクラス)をUser型(スーパークラス)として扱う(キャスト)
System.out.println(u.getUserName());
System.out.println(t.getUserName());
}
先に述べた上位概念と下位概念の関係性からして、図4を実行した際に、6行目の結果と7行目の結果が同じにならなければなりません。ここで、Javaではスーパークラスの特定のメンバーの実装をサブクラスで改変したことを示す注釈(annotation) を追加する必要があります。
@Override // 追加した注釈
public String getUserName() {
図5においては、@Override 注釈をメソッドの上部に追加しました。@アットマークから始まるキーワードをJavaでは注釈と呼び、クラス内のメンバーがどのように動作するか説明するための補助的な情報のことを言います。@Override注釈は、続くメソッドが、スーパークラスで定義されているメソッドの実装を、別の実装で上書きした(オーバーライド した)ものであることを示します。
このように、下位の概念の実例を、上位の概念として振る舞わせた時、下位の概念の振る舞いをそのまま引き継ぐ性質を多態性(Polymorphism) と呼びます。
つまり、下位の概念である「スポーツカー」を上位の概念である「車」として扱っても、「車」の振る舞いは「スポーツカー」として定義されている振る舞いそのものになる、ということです。多態性が導入されることで、特定の下位の概念かどうかを判断する制御構造を導入する必要がなくなり、結合度や凝集度を高めることにつながります。
[an error occurred while processing the directive]