2013-02-17 4 views
0

저는 두 시간 동안 다음과 같이 고민하고 있습니다. 예를 들어 클래스를 확장하지 않으면 다른 클래스에서 사용자 정의 클래스를 호출하는 방법은 무엇입니까?하위 클래스에서 다른 클래스로의 eventDispatcher

내 주요 기본 클래스 타이머 이벤트, Base.myTimer.addEventListener (TimerEvent.TIMER, processTime)에이 - 기본 클래스

그럼이 코드 Base.mytimer.removeEventListener 나중에 방법을 제거 (TimerEvent를 .TIMER, processTime - 기본 클래스

나는 그 처리를 끝낼 때 다시 메서드를 호출하려고하지만 메서드가 존재하지 않기 때문에이 메서드를 호출 할 수 없다는 버튼 (Btn 클래스)이 있습니다. 버튼 클래스하지만 기본 클래스에 플래시가 분명히 나에게 오류를 제공합니다 processTime 정의되지 않았습니다

예를 들어 n ow 버튼 내에서 이벤트 리스너를 다시 인스턴스화하려고하므로

Base.myTimer.addEventListener (TimerEvent.TIMER, processTime); 또는 this.parent.parent [ "myTimer"]. addEventListener()

myTimer는 기본 클래스의 정적 타이머입니다.

예를 들어 Base.myTimer.dispatchEvent (new TimerEvent (TimerEvent.TIMER))와 같은 사용자 지정 메서드가 아닌 경우 일반 dispatchEvent를 만들 수 있습니다.

지금까지 본 사례는 내 문제를 해결하지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

Button 클래스 인스턴스에 대한 참조를 Button 인스턴스에 전달할 수 있습니다.

// Button class 
package { 
    import Base; 
    // Other imports... 

    public class Button { 
     public function Button(base:Base):void { 
      // processTime and myTimer must be public. 
      // I put this line in the constructor for brevity, but if you stored base 
      // in an instance variable, you could put this anywhere in the button 
      // class. 
      Base.myTimer.addEventListener(TimerEvent.TIMER, base.processTime) 
     } 
    } 
} 

// Create button like this. 
var button:Button = new Button(base); 

// Or if button is created inside of Base 
var button:Button = new Button(this); 

더 나은 추가 및 청취자를 제거하기 위해, 기본 클래스의 두 가지 방법을 만들 수 있으며,을 MyTimer 및 processTime 비공개 것이다 :

public class Base { 
    public function addTimerListeners():void { 
     myTimer.addEventListener(TimerEvent.TIMER, processTime) 
    } 

    public function removeTimerListeners():void { 
     myTimer.removeEventListener(TimerEvent.TIMER, processTime) 
    } 
} 

는 그런 다음 외부에서이 두 가지 방법을 호출 할 수 있습니다 수업의 이렇게하면 클래스의 내부 동작을 더 숨길 수 있습니다. myTimer를 정적 대신 인스턴스 변수로 변경하려는 경우 Base 클래스 외부에서 코드를 변경할 필요가 없습니다. 이를 캡슐화라고하며 이는 좋은 습관입니다.

+0

이것이 내가 필요한 것이 었습니다. 나는 그것에 대해 생각해야했습니다. 매개 변수로 밑을 전달합니다. 좋은 답변 주셔서 감사합니다! –

+0

이 대답을 수락하면 동의 버튼을 클릭 하시겠습니까? :) – bwroga

0

버튼 클래스가 Base 클래스의 하위 트리에있는 것처럼 보입니다. 이 기본 클래스에서

dispatchEvent(new Event("AddListenerAgain", true)); 

을 클릭하면이 경우, 당신은 단지 당신은 이미 버튼 클래스에 대한 액세스 권한을 가지고 있어야합니다, 버튼 클래스에서 dispatchEvent에 작업을 수행 할 수 있습니다, 그래서 당신은 말할 수 :

button.addEventListener("AddListenerAgain", addListener); 

그런 다음이 예에서는 기본 클래스

private function addListener(e:Event) : void { 
myTimer.addEventListener(TimerEvent.TIMER, processTime); 
} 

에, 나는 파견하고 원시 문자열을 들었다. 이것은 권장되지 않습니다. 올바르게 수행하기 위해 사용자 정의 이벤트를 디스패치하는 방법을 읽어야합니다.

+0

고맙습니다. 시도해 보시고 효과가 있는지보십시오.그건 의미가 있습니다. –

관련 문제