Frage

Ich habe drei Klassen (Klasse A, Klasse B und Klasse C).

Klasse A ruft eine Instanz von B und läuft start () auf.

Die Klasse B erweitert den Thread. Wenn Start () aufgerufen wird, wird alles in der Run () -Methode ausgeführt.

Im Run () -Thread gibt es eine Instanz der Klasse C.

Gibt es sowieso eine Methode in der Klasse C, um eine Methode in Klasse A aufzurufen, ohne eine neue Instanz der Klasse A zu instanziieren?

Da ich die Klasse A auf Klasse B nicht erweitern kann (weil "Thread" bereits erweitert ist), weiß ich nicht, wie ich das tun würde.

Tut mir leid, dass ich vage bin, aber mein Projekt bietet viel zu viel Code und ist viel zu kompliziert, um ein direktes Code -Beispiel bereitzustellen.

Vielen Dank!

War es hilfreich?

Lösung

Also hast du

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

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

Sie können den Anrufer übergeben, der möglicherweise hässlich wird, da Sie einen ganz bis nach C über B übergeben müssen:

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

oder vereinfachen, insbesondere wenn B und C keinen anderen Grund haben, zu sein:

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

Andere Tipps

Dies ist eine kreisförmige Abhängigkeit, eine sehr schlechte Sache in OOP in meiner (bescheidenen) Meinung.

Sie müssen Ihren Code neu umrüsten, um eine gemeinsame Klasse für A und C bereitzustellen, und C.

Der beste Weg für den Start der Klasse B könnte es sein, einen Parameter zu überladen (a oder besser noch eine von a implementierte Schnittstelle). Dann kann B entweder das zum Abrufen durch C (wenn es sich um eine innere Klasse handelt) lagern oder es an Cs Konstruktor übergeben ...

BEARBEITEN:

Obwohl der Kommentator erwähnte, dass der Konstruktor überschrieben würde, passt er nicht zu den Parametern der Frage, die so formuliert wurde, dass B bereits existierte. Mein Vorschlag ist daher, den Start () wie folgt zu überlasten:

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

Diese Version ist jedoch nicht sicher. Bs Konstruktor funktioniert, wenn B jedes Mal tatsächlich instanziiert wird oder wenn C bei Start von B instanziiert wird, kann es an den Konstruktor von C übergeben werden, wenn es instanziiert wird.

Übrigens ist das Erweiterung von Thread aus mehreren Gründen im Allgemeinen nicht so gut wie die Implementierung von Runnable.

Eine andere Möglichkeit, das Thread -Verhalten in Java zu verwenden, besteht darin, Runnable zu implementieren. Möglicherweise können Sie a erweitern und Runnable implementieren und verwenden:

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

Aus OOP -Sicht scheint hässlich zu sein, aber es könnte unter bestimmten Umständen möglicherweise sinnvoll sein. Die beiden anderen Antworten scheinen etwas vernünftiger zu sein, stellten jedoch fest, dass dies berücksichtigt werden könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top