プロが教えるわが家の防犯対策術!

親クラスから子クラスへアクセス。

お世話になります。
以下のプログラムについて考えています。

public class Main{
 public static void main(String[] args) {
  SubA subA = new SubA();
  SubB subB = new SubB();
  Super[] subs = {subA,subB};
  subs[1].method();
  subs[2].method();
 }
}

class Super{
 String str = "親";
 public void method(){
  System.out.println(str);
 }
}

class SubA extends Super{
 String str = "子A";
}

class SubB extends Super{
 String str = "子B";
}

この場合、出力結果は当然


になります。
これを子クラスの str を表示するようにしたいのです。つまり
子A
子B
です。
ただし、子クラスで method() をオーバーライドしたり、super.str = "子A" のように親クラスを書きかえずにです。
子クラスが何百種類もある場合、全く同じmethod()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。
何か良案がありましたら、ぜひご教授ください。よろしくお願いします。

A 回答 (2件)

Super#method()の



System.out.println(str);



try { System.out.println(getClass().getDeclaredField("str").get(this)); } catch (Exception e) { e.printStackTrace(); }

に。
    • good
    • 0
この回答へのお礼

このイメージです、ありがとうございます。

これはリフレクションというやつでしょうか・・・
まったく無知だったので機能にかなり衝撃を受けました。
勉強したいと思います、ありがとうございました。

お礼日時:2010/08/18 17:00

とりあえず。


記載のソースの実行結果は例外で落ちますね。

本題。これではだめですか?
class Super {
  //String str = "親";
  public void method() {
    //System.out.println(str);
    System.out.println(getStr());
  }
  protected String getStr() {
    return "親";
  }
}
class SubA extends Super {
  //String str = "子A";
  @Override
  protected String getStr() {
    return "子A";
  }
}
class SubB extends Super {
  //String str = "子B";
  @Override
  protected String getStr() {
    return "子B";
  }
}

フィールドを定義しているならメソッドに変えてもそんなに手間は変わらないかなと。
    • good
    • 0
この回答へのお礼

エラーすみません、凡ミスでした;

うーん、手間はやはりかわらなそうですね。
しかし変更時に修正箇所を減らす点ではかなり有効だと思います。
ありがとうございました。

お礼日時:2010/08/18 16:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!