- 締切済み
親クラスから子クラスへアクセス。
親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 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()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- vaguechat
- ベストアンサー率85% (47/55)
Super#method()の System.out.println(str); を try { System.out.println(getClass().getDeclaredField("str").get(this)); } catch (Exception e) { e.printStackTrace(); } に。
- yamada_g
- ベストアンサー率68% (258/374)
とりあえず。 記載のソースの実行結果は例外で落ちますね。 本題。これではだめですか? 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"; } } フィールドを定義しているならメソッドに変えてもそんなに手間は変わらないかなと。
お礼
エラーすみません、凡ミスでした; うーん、手間はやはりかわらなそうですね。 しかし変更時に修正箇所を減らす点ではかなり有効だと思います。 ありがとうございました。
お礼
このイメージです、ありがとうございます。 これはリフレクションというやつでしょうか・・・ まったく無知だったので機能にかなり衝撃を受けました。 勉強したいと思います、ありがとうございました。