ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ActionScript LoungeコミュのUIObject.createObject()はなぜMovieClipをターゲットに呼出せるのか

  • mixiチェック
  • このエントリーをはてなブックマークに追加
[Flashcoders] createClassObject with List Class funky:=====
http://chattyfig.figleaf.com/pipermail/flashcoders/2006-April/164795.html
I just checked with the Macromedia livedocs, and createClassObject()
indeed is a member of the UIObject class. MovieClip is the superclass
of UIObject, and according to the AS2.0 Language Reference, MovieClip
does not have any createClassObject() member...so now I don't
understand why aMovieClip.createClassObject() works at all, eventhough
I am successfully using it.

[要旨] ドキュメントによればcreateClassObject()は、UIObjectクラスのメソッドです。MovieClipはUIObjectのスーパークラスですから、MoiveClipクラスがUIObject.createClassObject()を継承するはずはありません。しかし、createClassObject()メソッドは、MovieClipインスタンスをターゲットにして呼出すことができます。これはなぜでしょう?
=====

いい質問です(笑)。UIObject.createClassObject()は、MovieClip.attachMovie()メソッドのように、User Interface Componentsのコンポーネントインスタンスをスクリプトで動的に配置します。もっとも、コンポーネントの中に、別のコンポーネントインスタンスを作成するということは滅多にありません。普通は、MovieClipインスタンスのタイムラインに、コンポーネントインスタンスを配置します。

参考:「ActionScript 2.0 Tips講座」
http://www.fumiononaka.com/Sample/67/FR050915.html#Script006
*スクリプト001「ふたつのComboBoxをダイナミックに作成」参照

UIObjectは、MovieClipクラスを継承しています。ですから、UIObjectクラスがMovieClipのメソッドを継承するのは当然です。しかし、MovieClipインスタンスからUIObjectクラスのメソッドを使えるというのは、その反対です。継承で説明することはできません。

結論としては、UIObjectExtensionsクラスが、MovieClipクラスに対してUIObjectのメソッドを組込んでいるのです(この手法はMix-inと呼ばれます)。

すべてのUser Interface Componentsのシンボルには、UIComponentクラスの設定されたUIComponentシンボルのインスタンスが配置されています(上図左)。さらに、そのUIComponentシンボルには、UIObjectExtensionsクラスの設定されたUIObjectExtensionsシンボル(上図右)のインスタンスが内包されています。

したがって、User Interface Componentsのいずれかのコンポーネントが初めて初期化されるとき、UIComponetおよびUIObjectExtensionsクラスも初期化されます。すると、以下のように、UIObjectExtensions.Extensions()メソッドが呼出されて、UIObject.createClassObject()などのメソッドが、MovieClipクラス(MovieClip.prototype)に設定されることになるのです。

スクリプト001■UIObjectExtensions.Extensions()メソッド(抜粋)
class mx.core.ext.UIObjectExtensions
{
 // ...[中略]...

 static function Extensions():Boolean
 {
  // ...[中略]...
  var ui:Object = UIObject.prototype;
  // ...[中略]...
  var mc:Object = MovieClip.prototype;
  // ...[中略]...
  mc.createObject = ui.createObject;
  mc.createClassObject = ui.createClassObject;
  mc.createEmptyObject = ui.createEmptyObject;
  mc.destroyObject = ui.destroyObject;

 // ...[中略]...
 static var UIObjectExtended = Extensions();

なお、上記スクリプトの最後の行のステートメントは、形式的には静的(static)プロパティの初期化のかたちを取っています。けれども、これはクラスの静的(static)メソッドを呼出すための便法です。

コメント(0)

mixiユーザー
ログインしてコメントしよう!

ActionScript Lounge 更新情報

ActionScript Loungeのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング