- ベストアンサー
親クラスから呼ぶ
Javaで親クラスから子クラスを生成して、子クラスから親クラスのメソッドを呼ぶことが できますか? Cなら関数ポインタで呼ぶことができました。 また、C#ならデリゲートなどを使用して呼べました。 可能であれば小さいサンプルでいいので、教えていただけないでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
> フォームのボタンが押された場合にコントロールクラスに通知したい Observer パターンを使うのが一般的ではないかと思います。
その他の回答 (7)
- nda23
- ベストアンサー率54% (777/1415)
>関数のポインタを渡す staticでない関数は本体がインスタンスに依存する以上、 インスタンスの参照をしないで「関数の入口」を得ることは できません。staticな関数は静的にアドレスが決まっている ので、インスタンスに依拠しないで関数を呼べます。但し、 関数が所属するクラス内のstaticでない変数は当然ですが 参照できませんし、static属性の変数を変更するとスレッド セーフではなくなります。 public class 親 { int 定数1 = 1; //静的関数から参照できない static int 定数2 = 2; //静的関数から参照できる static int 静的関数() { } } public class 子 { int ある処理() { 親.静的関数(); //インスタンス化せずに呼び出せる。 } }
- salsberry
- ベストアンサー率69% (495/711)
ああ、"extends A"が消されていることに気付いていませんでした。失礼。「親クラス」「子クラス」って書かれたら、継承関係があると思ってしまうもの。 > フォームのボタンが押された場合にコントロールクラスに通知したい そういうことをするのに、フォームクラスのインスタンスが通知先のコントロールクラスのインスタンスへの参照を持っていることはごく自然なことだと思いますが。
- salsberry
- ベストアンサー率69% (495/711)
> ちょっと違います。 と言われても、ANo.3の解でもB.q()からAのm()やn()を呼べているので、何がどう不満なのかを補足してほしいところです。
- Tacosan
- ベストアンサー率23% (3656/15482)
「親」「子」をそういう意味で使ってるとは全く想像できなかった.... 言語仕様上, 少なくとも現時点では「きれいな方法」はなさそう. 「クロージャー的なにか」を作るとか, リフレクションを駆使するとかの方法はあるみたいだけど, 説明は面倒なので自分で調べてください. でも, C でどうやって実現してるんだろう. そもそも C に「メンバ関数」なんて存在しないのに.
補足
説明が下手ですいません。 ANo.5の補足のやり方を教えていただけないでしょうか?
- salsberry
- ベストアンサー率69% (495/711)
こういうことをしたいのでしょうか。 親クラスAのメソッドp()で子クラスBのインスタンスを生成して、Bのメソッドq()を呼びます。q()から、Aのメソッドm()とn()を呼んでいます。 class A { void p() { B obj = new B(); obj.q(); } void m() { System.out.println("A.m()"); } void n() { System.out.println("A.n()"); } } class B extends A { void n() { System.out.println("B.n()"); } void q() { m(); super.n(); } }
補足
ちょっと違います。 class A{ void p(){ B obj = new B(); obj.q(); } void m() { System.out.println("A.m()"); } void n() { System.out.println("A.n()"); } } class B{ void q(){ //ここでAのmやnを呼びたい。 } } }
- nda23
- ベストアンサー率54% (777/1415)
子クラスに親クラスを渡せば普通に呼び出せます。 public class 親 { public int 親メソッド() { ・・・ } private int 子の生成() { 子 obj = new 子(); int 戻り値 = obj.入口(this); ・・・ } } public class 子 { int 入口(親 obj) { ・・・ int 戻り値 = obj.親メソッド(); } }
補足
回答ありがとうございます。 確かにこの方法だといけますが、お互いインスタンスの参照を持ちあうことになります。 これ以外で関数のポインタを渡す、アクションリスナ?を使うなどしてできないでしょうか?? すいませんが知っていましたら、ご教授ください。
- Tacosan
- ベストアンサー率23% (3656/15482)
「親クラス」「子クラス」とはなんですか?
補足
No3補足のAが親クラス、Bが小クラスです。 よろしくお願いします。(><)
補足
A継承のBクラスではないということです。 すいません。具体的に書きます。 コントローラークラスがフォームクラスを生成して、フォームのボタンが押された場合にコントロールクラスに通知したいのですが、そのやり方がわかりません。 一般的にどう実現するべきなのでしょうか? そもそも、コントロールクラスがフォームクラスを生成することがおかしいのでしょうか?