0

私は 3 つのクラス (クラス A、クラス B、およびクラス C) を持っています。

クラス A は B のインスタンスを呼び出し、start() を実行します。

クラス B はスレッドを拡張するため、start() が呼び出されると、run() メソッド内のすべてが実行されます。

run() スレッドには、クラス C のインスタンスがあります。

クラス A の新しいインスタンスをインスタンス化せずに、クラス C のメソッドがクラス A のメソッドを呼び出せるようにする方法はありますか?

クラス A をクラス B に拡張できないため (「スレッド」が既に拡張されているため)、これを行う方法がわかりません。

あいまいで申し訳ありませんが、私のプロジェクトにはあまりにも多くのコードが含まれており、コードの例を直接提供するには複雑すぎます。

ありがとう!

4

4 に答える 4

1

だからあなたは

class A {
 void run()
 {
  new B().start();
 }
}

class B extends Thread {
  public void run(){
    C c = new C();  
    c.do something with A .. }
}

AをBからCまでずっと渡す必要があるため、醜くなる可能性のある発信者を渡すことができます。

class A {
 void run()
 {
  new B(this).start();
 }
}

class B extends Thread {
  public void run(A a){ 
    C c = new C();
    c.do something(a).. 
  }
}

または、特にBとCに他の理由がない場合は、単純化します。

class A {
 public void run()
 {
   this.do something() ... 
 }
}
于 2009-08-05T19:04:57.523 に答える
1

最良の方法は、クラス B をオーバーロードしてパラメーター (A、または A によって実装されたインターフェイス) を取得することです。次に、BはCによる検索用にそれを保存するか(内部クラスの場合)、Cのコンストラクターに渡すことができます...

編集:

コメンターが言及したように、コンストラクターのオーバーライドは機能しますが、B が既に存在するような方法で表現された質問のパラメーターには適合しないため、私の提案は次のように start() をオーバーロードすることです。

b.start(A aParam) {
    a=aParam;
    start();
}

ただし、このバージョンはスレッドセーフではありません。B のコンストラクターは、B が実際に毎回インスタンス化される場合、または b の開始時に C がインスタンス化される場合に機能し、インスタンス化されたときに C のコンストラクターに渡すことができます。

ところで、スレッドを拡張することは、いくつかの理由から、一般的にランナブルを実装するほど良くありません。

于 2009-08-05T18:53:19.497 に答える
1

これは循環依存であり、私の (控えめな) 意見では、OOP では非常に悪いことです。

A と C に共通のクラスを提供するには、コードをリファクタリングする必要があります。

于 2009-08-05T18:53:22.537 に答える
0

Java でスレッドの動作を利用するもう 1 つの方法は、Runnable を実装することです。おそらく、A を拡張し、Runnable を実装して、以下を使用できます。

Thread t = new Thread( b )
t.start();

OOP の観点からは醜いように見えますが、特定の状況下では理にかなっている可能性があります。他の2つの答えはもう少し賢明に見えますが、これは考慮できると考えました.

于 2009-08-05T19:04:00.597 に答える