2009-08-05 6 views
0

J'ai trois classes (classe A, classe B et classe C).Extension Java/abstraction/implémentation question

La classe A appelle une instance de B et exécute start().

La classe B étend Thread, donc quand start() est appelée, tout ce qui est dans la méthode run() est exécuté.

Dans la course() fil, il y a une instance de la classe C.

est-il de toute façon à permettre une méthode de classe C pour appeler une méthode dans la classe A, sans instancier une nouvelle instance de la classe A?

Puisque je ne peux pas étendre la classe A à la classe B (parce que "Thread" est déjà étendu), je ne sais pas comment j'y arriverais.

Désolé d'être vague, mais mon projet comporte trop de code et est trop compliqué pour fournir un exemple de code direct.

Merci!

Répondre

1

Vous avez donc

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

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

Vous pouvez transmettre l'appelant, ce qui pourrait devenir laid, comme vous devez passer un tout le long de C à B:

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

ou simplifier, surtout si B et C n'ont pas d'autre raison d'être:

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

Super, merci! Beaucoup de bons conseils tout au long, mais étant limité dans le temps, c'était la solution la plus facile pour quelque chose de mal conçu et trop compliqué. – Monster

1

Le meilleur moyen serait que le début de la classe B soit surchargé pour prendre un paramètre (A, ou mieux encore, une interface implémentée par A). Ensuite B peut soit stocker que pour la récupération par C (si elle est une classe interne) ou passer au constructeur de C ...

EDIT:

Bien que l'intervenant a mentionné surcharger le constructeur travaillerait, il n » t correspondant aux paramètres de la question qui a été formulée de telle sorte que B existait déjà, donc ma suggestion est de surcharger le début() comme ceci:

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

cette version est pas sûre cependant. Le constructeur de B fonctionne si B est réellement instancié à chaque fois, ou si C est instancié quand b démarre, alors il pourrait être passé au constructeur de C tel qu'il est instancié. Par ailleurs, le filetage prolongé n'est généralement pas aussi bon que la mise en œuvre de runnable pour de nombreuses raisons.

+0

Je suis sûr que vous vouliez dire "constructeur de classe B". Overriding Thread.start() ne fera pas beaucoup de bien. – ChssPly76

1

Ceci est une dépendance circulaire, une très mauvaise chose dans la POO dans mon opinion (modeste).

Vous devez factoriser votre code pour fournir une classe commune pour A et C.

0

Une autre façon d'utiliser le comportement de fil en Java est de mettre en œuvre Runnable. On peut imaginer que vous pouvez étendre A, et mettre en œuvre Runnable, et utiliser:

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

Semble laid d'un point de vue de la POO, mais il pourrait en théorie donner un sens dans certaines circonstances. Les deux autres réponses semblent un peu plus raisonnables, mais ont pensé que cela pourrait être envisagé.