• 締切済み

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

親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 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()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。

みんなの回答

  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.2

Super#method()の System.out.println(str); を try { System.out.println(getClass().getDeclaredField("str").get(this)); } catch (Exception e) { e.printStackTrace(); } に。

momomoStar
質問者

お礼

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

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

とりあえず。 記載のソースの実行結果は例外で落ちますね。 本題。これではだめですか? 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";   } } フィールドを定義しているならメソッドに変えてもそんなに手間は変わらないかなと。

momomoStar
質問者

お礼

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

関連するQ&A