문제

세 가지 클래스 (클래스 A, 클래스 B 및 클래스 C)가 있습니다.

클래스 A는 B의 인스턴스를 호출하고 start ()를 실행합니다.

클래스 B는 스레드를 확장 시키므로 start ()가 호출되면 run () 메소드의 모든 것이 실행됩니다.

run () 스레드에는 클래스 C 인스턴스가 있습니다.

어쨌든 클래스 C의 메소드가 클래스 A의 새로운 인스턴스를 인스턴스화하지 않고 클래스 A의 메소드를 호출 할 수 있는가?

클래스 A를 클래스 B로 확장 할 수 없으므로 ( "스레드"가 이미 확장 되었기 때문에), 내가 어떻게이 일을하는지 모르겠습니다.

모호하게 미안하지만 내 프로젝트는 너무 많은 코드를 특징으로하며 직접 코드 예제를 제공하기에는 너무 복잡합니다.

감사!

도움이 되었습니까?

해결책

그래서 당신은 가지고 있습니다

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

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

발신자를 통과 할 수 있습니다.

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

다른 팁

이것은 원형 의존성이며, 내 (겸손한) 의견에서 OOP에서 매우 나쁜 것입니다.

A 및 C에 공통 클래스를 제공하려면 코드를 리팩토링해야합니다.

가장 좋은 방법은 클래스 B가 오버로드되어 매개 변수를 가져 오기 위해 (a 또는 더 나은지, a에 의해 구현 된 인터페이스)입니다. 그런 다음 B는 C (내부 클래스 인 경우)에 의해 검색을 위해 저장하거나 C의 생성자로 전달할 수 있습니다 ...

편집하다:

주석가가 생성자를 우선시하는 것을 언급했듯이, B가 이미 존재하는 방식으로 표현 된 질문의 매개 변수에 맞지 않으므로, 내 제안은 다음과 같이 start ()에 과부하하는 것입니다.

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

그러나이 버전은 스레드 안전하지 않습니다. B의 생성자는 B가 실제로 매번 인스턴스화되거나 B가 시작될 때 C가 인스턴스화되는 경우 작동하면 인스턴스화 된대로 C의 생성자로 전달 될 수 있습니다.

그건 그렇고, 확장 스레드는 일반적으로 몇 가지 이유로 실행 가능하는 것만 큼 좋지 않습니다.

Java에서 스레드 동작을 활용하는 또 다른 방법은 Runnable을 구현하는 것입니다. 아마도 당신은 a를 확장하고 실행 가능하고 사용할 수 있습니다.

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

OOP 관점에서 추악한 것처럼 보이지만 특정 상황에서는 의미가있을 수 있습니다. 다른 두 가지 대답은 조금 더 합리적으로 보이지만 이것이 고려 될 수 있다고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top