プログラミング応用a 第12回『継承の基礎2』12-2〜スーパークラスメンバの参照 |
【12-2 スーパークラスメンバの参照】
■質問:「サブクラスでスーパークラスと同じ名前のメンバを定義してしまったら,サブクラスのメンバとスーパークラスから継承したメンバのどっちが使われるの?」
例)下図のクラスBは,スーパークラスAから継承した i と m( ) と同じ名前のメンバを,自分自身でも定義して持っている。クラスBの中で i と m( ) を利用しようとした場合,どちらのことを指すことになる??
■答え:「スーパークラスのメンバ名とサブクラスのメンバ名が同じになってしまう場合は,サブクラス(自クラス)のメンバの方が使われる。」
例)上図の場合,クラスBの中で i と m( ) を利用した場合には,スーパークラスAから継承した i や m( ) ではなく,自分(クラスB)独自の i と m( ) のことを指す。
※メソッドm( ) に関しては,メソッドm( ) をオーバライドしている状況。
■スーパークラスのメンバを無理矢理利用するための魔法の言葉 super
・説明したように,サブクラスとスーパークラスで同じ名前のメンバが定義されている場合,サブクラスからそれらのメンバを利用する場合は,サブクラス独自のメンバのことを指すことになる。
・ただし,
super.メンバ名
という形で,スーパークラスのメンバを利用することができる(下図)。
・super でスーパークラスから継承したメンバを利用できることを確認するサンプルプログラム。
List 7 (注:ここで定義しているクラスAは,説明のための便宜的なクラスで特に何かを表しているわけでは無い。)
■おすすめの方法
・できるだけ,クラスを定義するときは,スーパークラスのメンバと同じ名前のメンバは定義しないようにしよう。
※ただし,メソッドオーバライドに関しては話は別である。学習したように,メソッドオーバライドはスーパークラスから継承したメソッドをサブクラスであえて定義し直す。