2012-01-29 2 views
0

확장 가능한 UI 요소를 사용하는 응용 프로그램을 작성하고 있습니다. 구성 요소를 사용하여 런타임에 정확한 구현이 결정됩니다. 예를 들어, 구성에 따라 글 머리 기호 목록, 번호 매기기 목록, 두 개의 열 목록 등으로 표시되는 항목 목록을 표시하려고합니다. 포함하는 응용 프로그램은 특정 구현에 대해 아무것도 모르는 것을 제외하고는 메서드 호출 setItems(items:Array):void을 지원하는 형식입니다. 이제SWF 경계에서 유형이 지정된 변수에 할당 나누기

package my.stuff { 
    public class TwoColumnList extends BaseList { 
     protected var m_columns:Array; 
     public function TwoColumnList() { 
      super(); 
      m_columns = new Array(); 
      m_columns.push(new Array()); 
      m_columns.push(new Array()); 
     } 
     public override function setItems(items:Array):void { 
      for (var i:int = 0; i < items.length; i++) { 
       m_items.push(items[i]); 
       m_columns[i%2].push(items[i]); 
      } 
     } 
    } 
} 

: 내가 예를 들어, 수행하는 전문 구현을 만들 수있는 두 개의 열 목록을

package my.stuff { 
    public class BaseList extends MovieClip { 
     protected var m_items:Array; 
     public function BaseList() { 
      m_items = new Array(); 
     } 
     public function setItems(items:Array):void { 
      for (var i:int = 0; i < items.length; i++) 
       m_items.push(items[i]); 
     } 
    } 
} 

을 그리고 :

은 그래서 예를 들어, 기본 클래스를 설정 한 UI 자체는 Flash Professional에서 FLA로 수행되며 클래스 "TwoColumnList"는 "문서 클래스"로 사용됩니다. 대상 SWF에 FLA ("publish")를 컴파일 한 다음 응용 프로그램에로드하려고합니다. 작동하지 않는이 제외

public function startLoading(implURL:String):void) { 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.INIT, doneLoadingImpl); 
    loader.load(new URLRequest(implURL)); 
} 

public function doneLoadingImpl(e:Event) { 
    var info:LoaderInfo = e.target as LoaderInfo; 
    var impl:DisplayObject = info.content; 
    m_containerClip.addChild(impl); 
    var listImpl:BaseList = impl as BaseList; 
    impl.setItems(m_allItems); 
} 

을 - addChild() 잘 작동하지만 null에서 BaseList 결과 캐스트 (안 예외 - 단지 null) : 일반적으로 나는 이것이과 같이 일을 기대. 나는 잘 implMovieClip에 캐스팅 할 수 있으며 캐스트 업 후 잘 나는이 같은 BaseList에, TwoColumnList에 그것을 디렉토리를 캐스팅 할 수 있습니다

... 
var listImpl:BaseList = impl as TwoColumnList; 
... 

을 따라서 작동,하지만 정말의 목적을 패배 전체 운동 - 이 아니며은 미래에 생성 될 수있는 특정 UI 구현을 사전에 알고 있습니다.

나는 info.applicationDomain.getDefinition에 대해 어딘가 읽었지만 어떤 효과가 있다고 말할 수는 없습니다.

저는 하루 종일 일하는 ActionScript 개발자가 아니며, 주요 개발자가 더 이상 회사와 함께하지 않은 프로젝트에서 도움을 청했습니다. 도움이 필요합니다. 고맙습니다.

답변

1

문제는 대부분 다른 응용 프로그램 도메인에로드되는 클래스와 관련이 있습니다. 객체가 당신이 캐스팅하는 클래스의 하위 클래스가 아니라면 타입 캐스트는 null을 반환합니다. 그리고 두 버전의 BaseList가 서로 "경쟁"하는 것 같습니다. 이 경우

, 명시 적으로 주와 동일한 응용 프로그램 도메인에 SWF를로드하여 해결할 수 있습니다

var ldrContext : LoaderContext = new LoaderContext (false, ApplicationDomain.currentDomain); 
var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.INIT, doneLoadingImpl); 
loader.load(new URLRequest(implURL), ldrContext); 

을하지만, 외부 콘텐츠를로드 할 때 특히, 당신이 정말로 사용한다 인터페이스. 구현을 분리 된 상태로 유지하는 것은 그들이 개발 한 것과 똑같습니다. this blog page,에서 외부 파일을로드 할 때 인터페이스를 사용해야하는 이유를 설명합니다 (인터페이스에 대한 기본 정보에 대한 링크도 있습니다). 덧붙여 작성자가 귀하와 비슷한 문제가있는 것 같습니다 ...;)

+0

@weltraumpiray : 일반적으로 당신이 말한 것은 좋은 생각처럼 들리므로 대답을 받아 들일 것이지만 실제로는 실제 문제가 아닙니다.실제 문제는 내가 멍청하다는 것입니다. - FlashBuilder에서 빌드 한 클래스로 FLA를 컴파일하여 시각적으로 만들었지 만 올바른 소스 디렉토리를 참조하도록 FLA를 설정해야합니다. 그렇지 않으면 Flash Professional에서 사실은 지정된 "문서 클래스"의 클래스 구현을 보지 않으며 코드가없는 스텁을 행복하게 컴파일합니다. "ActionScript 설정"에서 소스 디렉토리 설정을 수정 한 후 모든 것이 예상대로 작동했습니다. :-) – Guss

+0

@Guss : 문제는 실제로 두 개의 다른 BaseLists가 경쟁 한 것처럼 보입니다.) 어쨌든 인터페이스에 대해 생각해야합니다. 동일한 클래스를 둘 이상의 SWF로 컴파일하는 것은 좋은 생각이 아닙니다. – weltraumpirat

+0

고맙습니다 @weltraumpirat,하지만 특정 경우 (예제 코드는 아님)에서는 기본 클래스가 많은 로직을 제공하며 특수화는 FLA의 시각적 디자인을 기본 클래스의 논리에 "붙이기"위해 사용됩니다 메트릭 및 일부 작은 동작의 특수화 제공). – Guss