• ベストアンサー

親クラスから呼ぶ

Javaで親クラスから子クラスを生成して、子クラスから親クラスのメソッドを呼ぶことが できますか? Cなら関数ポインタで呼ぶことができました。 また、C#ならデリゲートなどを使用して呼べました。 可能であれば小さいサンプルでいいので、教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • racene
  • ベストアンサー率70% (21/30)
回答No.7

> フォームのボタンが押された場合にコントロールクラスに通知したい Observer パターンを使うのが一般的ではないかと思います。

その他の回答 (7)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.8

>関数のポインタを渡す staticでない関数は本体がインスタンスに依存する以上、 インスタンスの参照をしないで「関数の入口」を得ることは できません。staticな関数は静的にアドレスが決まっている ので、インスタンスに依拠しないで関数を呼べます。但し、 関数が所属するクラス内のstaticでない変数は当然ですが 参照できませんし、static属性の変数を変更するとスレッド セーフではなくなります。 public class 親 { int 定数1 = 1; //静的関数から参照できない static int 定数2 = 2; //静的関数から参照できる static int 静的関数() { } } public class 子 { int ある処理() { 親.静的関数(); //インスタンス化せずに呼び出せる。 } }

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.6

ああ、"extends A"が消されていることに気付いていませんでした。失礼。「親クラス」「子クラス」って書かれたら、継承関係があると思ってしまうもの。 > フォームのボタンが押された場合にコントロールクラスに通知したい そういうことをするのに、フォームクラスのインスタンスが通知先のコントロールクラスのインスタンスへの参照を持っていることはごく自然なことだと思いますが。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.5

> ちょっと違います。 と言われても、ANo.3の解でもB.q()からAのm()やn()を呼べているので、何がどう不満なのかを補足してほしいところです。

Vernal412
質問者

補足

A継承のBクラスではないということです。 すいません。具体的に書きます。 コントローラークラスがフォームクラスを生成して、フォームのボタンが押された場合にコントロールクラスに通知したいのですが、そのやり方がわかりません。 一般的にどう実現するべきなのでしょうか? そもそも、コントロールクラスがフォームクラスを生成することがおかしいのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「親」「子」をそういう意味で使ってるとは全く想像できなかった.... 言語仕様上, 少なくとも現時点では「きれいな方法」はなさそう. 「クロージャー的なにか」を作るとか, リフレクションを駆使するとかの方法はあるみたいだけど, 説明は面倒なので自分で調べてください. でも, C でどうやって実現してるんだろう. そもそも C に「メンバ関数」なんて存在しないのに.

Vernal412
質問者

補足

説明が下手ですいません。 ANo.5の補足のやり方を教えていただけないでしょうか?

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

こういうことをしたいのでしょうか。 親クラス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(); } }

Vernal412
質問者

補足

ちょっと違います。 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)
回答No.2

子クラスに親クラスを渡せば普通に呼び出せます。 public class 親 { public int 親メソッド() { ・・・ } private int 子の生成() {   子 obj = new 子();   int 戻り値 = obj.入口(this); ・・・ } } public class 子 { int 入口(親 obj) { ・・・   int 戻り値 = obj.親メソッド(); } }

Vernal412
質問者

補足

回答ありがとうございます。 確かにこの方法だといけますが、お互いインスタンスの参照を持ちあうことになります。 これ以外で関数のポインタを渡す、アクションリスナ?を使うなどしてできないでしょうか?? すいませんが知っていましたら、ご教授ください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「親クラス」「子クラス」とはなんですか?

Vernal412
質問者

補足

No3補足のAが親クラス、Bが小クラスです。 よろしくお願いします。(><)

関連するQ&A