2009-08-05 15 views
0

私は3つのクラス(クラスA、クラスB、クラスC)を持っています。Java拡張/抽象化/実装の質問

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

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

、クラスC

のインスタンスは、クラスAの新しいインスタンスをインスタンス化せずに、クラスCのメソッドは、クラスAのメソッドを呼び出すことができるように、とにかくそこにあるのですか?

クラスAをクラスBに拡張することはできません(「スレッド」は既に拡張されているため)、私はこれをどうやってやるのか分かりません。

申し訳ありませんが漠然としていますが、私のプロジェクトではコードが非常に多く、直接的なコード例を提供するには複雑すぎます。

ありがとうございます!

答えて

1

だから、あなたはBを通じてCまでのすべての方法を渡すために持っているようにあなたは、醜い得る可能性があります発信者を、渡すことができ

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

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

を持っています特にBとCに他の理由がない場合:

class A { 
public void run() 
{ 
    this.do something() ... 
} 
} 
+0

よかった、ありがとう!全体を通して大きなアドバイスがたくさんありましたが、時間が限られていました。これは、設計が不適切で複雑すぎるもののための最も簡単な修正でした。 – Monster

1

クラスBの開始がパラメータを取るためにオーバーロードされている可能性があります(A、またはより良いですが、Aによって実装されたインターフェイス)。その後、Bは、...(それは内部クラスの場合)Cによる検索のためにそれを保存するか、Cのコンストラクタに渡すことができるいずれか

EDIT:

コメント投稿コンストラクタがうまくいくオーバーライド述べたように、それはdoesnのが」私の提案は次のように()の開始をオーバーロードすることがあるので、tは、Bが既に存在していたように言葉で表現された質問のパラメータをフィット:

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

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

ところで、スレッドを拡張することは、多くの理由で実行可能ファイルを実装するほど一般的ではありません。

+0

"クラスBのコンストラクタ"を意味すると思います。 Thread.start()をオーバーライドしても、あまり良いことはありません。 – ChssPly76

1

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

0

のためにJavaでスレッドの挙動を利用する別の方法を一般的なクラスを提供するために、あなたのコードをリファクタリングしなければならない

はRunnableを実装することです。おそらくあなたはAを拡張し、Runnableを実装し、使用することができます

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

は、ビューのOOP点から醜いようだが、それはおそらく、特定の状況下で意味を作ることができます。他の2つの答えはちょっと分かりやすいようですが、これが考えられると考えました。、

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).. 
    } 
} 

または簡素化:

関連する問題