プログラミング応用a 第11回 『継承の基礎1』 11-3. メソッドオーバライド


【11-3. メソッドオーバライド】〜 ここでは,メソッドのオーバーライドとオブジェクト指向がもたらす汎用性について解説する。

サブクラスは,スーパークラスの能力を受け継ぐので,サブクラスのオブジェクトはスーパークラスのオブジェクトとして扱わうことが可能で有る事はわかった。

しかし, 単にクラスを継承するだけでは,あまり御利益は無い。下図の List 9 を使って,その点を確かめてみよう。

List 9 では,「鳴く動物」を表すスーパークラス CryingAnimal を定義し, cry( ) というメソッドは,鳴き声を上げる,という行為を表している
( CryingAnimal クラス自体は具体的な動物を表しているわけではないので, cry() メソッドは黙っているように"....."と表示するように定義されている)。

そのCryingAnimal のサブクラスとして,犬を表す Dog,猫を表す Catクラスを定義している。
しかし, Dog型もCat型も cry() メソッドをそのまま CryingAnimal クラスから継承しているために,犬らしく鳴いたり,猫らしく鳴いたりすることができない(List 9の実行結果および下図参照)。


List 9

そこで,サブクラスである Dog クラスや Cat クラスでは,スーパークラスのメソッド cry()を継承しつつも, その具体的動作だけ定義し直したい(上図Fig.10およびその右の図)。

実際,スーパークラスから継承したメソッドの処理内容を,サブクラスで変更することが出来る。
方法は簡単で,スーパークラスから継承したメソッドをサブクラスで再度定義し直せば良い。これを,メソッドオーバライド( method override )と呼ぶ。

早速,List 9 をメソッドオーバライドを使って,改良してみよう。

List 10, List 11

 

なお,オーバライドは以前学習したオーバロードとは違うので注意すること。


 

では,この「継承とオーバライド」という考え方を使って冒頭の製図ソフトの問題を解決してみよう。

次へ進む