0

拡張可能な UI 要素を使用するアプリケーションを作成しています。その正確な実装は、構成を使用して実行時に決定されます。たとえば、構成に応じて、箇条書き、番号付きリスト、2 列のリストなどとして表示される項目のリストを表示したいと考えています。メソッド呼び出しをサポートする型ですsetItems(items:Array):void

したがって、次のような基本クラスを設定しました。

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]);
        }
    }
}

そして、たとえば 2 列のリストを行う特殊な実装を作成しました。

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]);
            }
        }
    }
}

現在、UI 自体は、クラス TwoColumnList を「ドキュメント クラス」として持つ FLA として Flash Professional で行われます。FLA をターゲット SWF にコンパイル (「パブリッシュ」) してから、それをアプリケーションにロードしようとします。通常、これは次のように機能することを期待しています。

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()機能しますが、へのキャストBaseListnull(例外ではなく-単にnull)になります。私はうまくキャストimplできますし、MovieClipディレクトリを にキャストすることもできます。その後、次のようにTwoColumnListうまくキャストできます。BaseList

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

これは機能しますが、演習全体の目的、つまり、将来作成される可能性のある特定の UI 実装を前もって知ることができないという目的を実際に無効にします。

を行うことについてどこかで読みinfo.applicationDomain.getDefinitionましたが、それが何の効果もないとは言えません。

私は日常の仕事で ActionScript 開発者ではありません。主な開発者が会社にいなくなったプロジェクトを手伝うように呼ばれたばかりで、困惑しています。助けていただければ幸いです。

4

1 に答える 1

1

あなたの問題は、異なるアプリケーション ドメインにロードするクラスに関連している可能性が最も高いです。オブジェクトがキャスト先のクラスのサブクラスでない場合、型キャストは null を返します。2 つのバージョンの 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 );

ただし、特に外部コンテンツをロードする場合は、実際にインターフェイスを使用する必要があります。実装を分離しておくことは、まさにそれらが発明された目的です。このブログページを確認してください。外部ファイルをロードするときにインターフェースを使用する必要がある理由が説明されています (インターフェースに関するより基本的な情報へのリンクもあります)。偶然にも、作成者はあなたと同様の問題を抱えていたようです... ;)

于 2012-01-29T23:08:34.057 に答える