2009-08-05 5 views
0

세 클래스 (클래스 A, 클래스 B 및 클래스 C)가 있습니다.Java 확장/추상화/구현 질문

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

클래스 B는 Thread를 확장하므로 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

가장 좋은 방법은 매개 변수 (A 또는 더 나은 방법으로 A로 구현 된 인터페이스)를 사용하기 위해 클래스 B의 시작을 오버로드하는 것일 수 있습니다. 이어서 B는 (그것이 내부 클래스의 경우) C가 검색을 위해 그 저장 또는 C의 생성자에 전달할 수있는 하나

EDIT :

주석 기 생성자 일하는 것이 재정의 한 바와 같이,이 케이 비록 ' 나의 제안은 다음과 같이() 시작을 과부하 그래서 t는 B가 이미 존재하는 방식으로 표현한 된 질문의 매개 변수를 맞게 :

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

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

그런데 확장 스레드는 일반적으로 몇 가지 이유로 runnable을 구현하는 것만 큼 좋지 않습니다.

+0

"클래스 B의 생성자"를 의미 할 것입니다. Thread.start()를 오버라이드 (override)하면 (자) 많은 도움이되지 않습니다. – ChssPly76

1

이것은 순환 종속성이며, 내 (겸손한) 의견의 OOP에서 매우 나쁜 것입니다. 당신은 A와 C.

0

을위한 자바 스레드 동작을 활용하는 또 다른 방법은 공통 클래스를 제공하기 위해 코드를 리팩토링해야한다

는 Runnable를 구현하는 것입니다. 알만 당신은을 확장하고 Runnable를 구현하고 사용할 수 있습니다

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

이보기의 OOP의 관점에서 추한 것 같은데,하지만 생각할 특정 상황에서 감각을 만들 수 있습니다. 다른 두 가지 대답은 좀 더 합리적인 것 같지만 이것이 고려 될 수 있다고 생각했습니다.,

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

또는 단순화 :