導入
オブジェクト指向のプログラミング言語の機能の中でも目玉と呼べるものが「継承」です。しかしながら継承によって発生する可能性があるデメリットが大きいため,
展開
必要な機能を持っているクラスを利用する仕組みが継承と委譲
継承や委譲を使う基本的なストーリーは次の2通りが考えられます。
あるクラスAを作成した後に,
そのクラスAの機能と同じ機能を持ち, さらに別の機能を持つクラスBを作成したくなったとします。このような場合に継承や委譲を用います。 あるいは,
あるクラスAとBが同じ機能を持つ良く似たコードを持っているとします。この良く似た部分のコードを切り出してクラスCにまとめるリファクタリングを行います。そしてクラスCを継承, あるいは委譲するクラスA'とB'を作成します。
どちらも複数のクラスの間に,
単純に継承したクラスと, 著作者名情報を取得するメソッドを追加したクラスをつくる
これから紹介するサンプルコードは,ConfigInfoクラスとします。そしてこれを継承したAppInfoLoader8クラスを作成します。さらに新しいクラスAppInfoLoader9には著作者情報を持たせ,TestAppInfoLoader6.pdeとします。
以下のファイルはTestAppInfoLoader6フォルダに納めてください。CONFIG.TXTとSETTING.TXTはさらにその中のdataフォルダに納めてください。
「インターフェイスの実装」と「クラスの継承」の最も大きな違いでありメリットは,AppInfoLoader8クラスはコンストラクタとgetClassNameメソッドしか持ちません。それにもかかわらず,ConfigInfoクラスのメソッドを呼び出して使うことができます。目的の仕事をするメソッドをスーパークラスが持っていれば,
さらに追加の機能が欲しくなった場合,AppInfoLoader9では,ConfigInfoを継承した後に著作者名を取得するための新しいメソッドgetAuthorNameを追加しています。
プロトタイピング中など,ConfigInfoクラスへ吸収し,ConfigInfoクラスを継承するクラスを再構成するのです。
緻密な設計を必要とするクリティカルなシステムのコードではこんな行き当たりばったりな方法論は通用しませんが,
継承した後, 今あるメソッドをオーバーライドする。
クラスConfigInfoとクラスAppInfoLoader8やAppInfoLoader9を比較すると,getClassNameが定義されています。
クラスConfigInfoのgetClassNameメソッド
private final String CLASS_NAME = "ConfigInfo";
public String getClassName(){
return CLASS_NAME;
}クラスAppInfoLoader8のgetClassNameメソッド
public static final String CLASS_NAME = "AppInfoLoader8";
public AppInfoLoader8(){
loadConfigInfo(CONFIG_FILENAME);
}このように,ConfigInfoを単体で使用する際には,getClassNameメソッドでクラス名を取得すると,ConfigInfoで定義されている定数CLASS_NAMEの値ConfigInfoが取得されます。
クラスAppInfoLoader8を使用する際には,getClassNameメソッドでクラス名を取得すると,AppInfoLoader8で定義されている定数CLASS_NAMEの値AppInfoLoader8が取得されます。 2つのクラスを使うコードの側から見ると,AppInfoLoader8のインスタンスのスーパークラスのクラス名が必要ならば,AppInfoLoader8内でsuper.getClassName()と呼べば,