Pergunta

Eu tenho três classes (Classe A, Classe B e Classe C).

Classe A chama uma instância de B e Runs Start ().

A classe B estende thread, portanto, quando o método start () é chamado, qualquer coisa no método run () é executada.

No thread run (), há uma instância da classe C.

Existe alguma maneira de permitir que um método na Classe C chamasse um método na Classe A, sem instanciar uma nova instância da Classe A?

Como não posso estender a Classe A à Classe B (porque o "Thread" já está estendido), não sei como fazer isso.

Desculpe por ser vago, mas meu projeto apresenta muito código e é muito complicado para fornecer um exemplo de código direto.

Obrigado!

Foi útil?

Solução

Então você tem

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

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

Você pode passar pelo chamador, o que pode ficar feio, pois você precisa passar por C até C a 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 simplificar, especialmente se B e C não tiverem outra razão para ser:

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

Outras dicas

Esta é uma dependência circular, uma coisa muito ruim na minha opinião (modesta).

Você deve refatorar seu código para fornecer uma classe comum para A e C.

A melhor maneira pode ser o início da classe B a ser sobrecarregado para pegar um parâmetro (A, ou melhor ainda, uma interface implementada por A). Então B pode armazená -lo para recuperação por c (se for uma classe interna) ou passá -lo para o construtor de C ...

EDITAR:

Embora, como o comentarista mencionou que a substituição do construtor funcionaria, ele não se encaixa nos parâmetros da pergunta que foi formulada de tal maneira que B já existia, então minha sugestão é sobrecarregar o início () como este:

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

Esta versão não é segura no tópico, no entanto. O construtor de B funciona se B for realmente instanciado sempre, ou se C for instanciado quando B iniciar, ele poderá ser passado para o construtor de C à medida que é instanciado.

A propósito, a extensão do encadeamento não é geralmente tão boa quanto a implementação do Runnable por alguns motivos.

Outra maneira de utilizar o comportamento do thread no Java é implementar o Runnable. É concebível que você possa estender um e implementar o Runnable, e usar:

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

Parece feio do ponto de vista do OOP, mas pode fazer sentido em certas circunstâncias. As outras duas respostas parecem um pouco mais sensatas, mas imaginaram que isso poderia ser considerado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top