今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

superに渡したオブジェクトを使いたい

コンストラクタにListを受け取るこんなクラスを継承するとします。

class A{
  private List l;
  A(List l){
    this.l = l;
  }
}

そうすると、こんな感じになります。

class B{
  B(){
    super(new ArrayList());
  }
}

コードがうまく書けない原因は、継承したサブクラスがコンストラクタのシグネチャを変えていることにある。スーパークラスのコンストラクタが引数を持つ場合、サブクラスでも同じ引数を持つコンストラクタを作るのが基本だ。それをやってないから結果的に分かりにくいコードになっている。
以下のように、同じ引数を持つコンストラクタを作っておけば何も問題はない。List は、このコンストラクタを呼び出すオブジェクトが用意することを前提にしてスーパークラスが設計されているのだから、継承する場合もその前提を守ればいい。

class B extends A {
  private List l;
  B(List l) {
    this.l = l;
  }
}