拡張可能な 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()
機能しますが、へのキャストBaseList
はnull
(例外ではなく-単にnull
)になります。私はうまくキャストimpl
できますし、MovieClip
ディレクトリを にキャストすることもできます。その後、次のようにTwoColumnList
うまくキャストできます。BaseList
...
var listImpl:BaseList = impl as TwoColumnList;
...
これは機能しますが、演習全体の目的、つまり、将来作成される可能性のある特定の UI 実装を前もって知ることができないという目的を実際に無効にします。
を行うことについてどこかで読みinfo.applicationDomain.getDefinition
ましたが、それが何の効果もないとは言えません。
私は日常の仕事で ActionScript 開発者ではありません。主な開発者が会社にいなくなったプロジェクトを手伝うように呼ばれたばかりで、困惑しています。助けていただければ幸いです。