2

私の質問は、子オブジェクトの親にアクセスするためのベスト プラクティスに関するものです。クラスが別のクラスをインスタンス化するとしましょう。そのクラス インスタンスはオブジェクトで参照されます。その子オブジェクトから、親オブジェクトを参照する最良の方法は何ですか? 現在、私が頻繁に使用するいくつかの方法を知っていますが、A) それを行うためのより良い方法があるのか​​、それとも B) どちらがより良い方法なのかはわかりません

最初の方法は、getDefinitionByName を使用することです。これは、そのクラスをインスタンス化せず、公に宣言されたクラス内のすべてのものへのアクセスを許可します。

_class:Class = getDefinitionByName("com.site.Class") as Class;

次に、親から子への階層に基づいてその変数を参照します。
例: 子がそれ自体から 2 レベル上のクラスを参照しようとしている場合:

_class(parent.parent).function();

これは問題ないように見えますが、アクセスしようとしている親のレベルと比較して、子供がどのレベルにあるかを知る必要があります。

次のステートメントを取得して、[object ClassName] を Flash の出力にトレースすることもできます。

trace(Class);

私はその行の実装について 100% ではありません。私がいる現在のオブジェクトの外部にあるオブジェクトを参照する方法としてそれを主張していません。

私が使用した別の方法は、 this への参照を作成中のクラスオブジェクトに単純に渡し、コンストラクター引数でキャッチすることです

var class:Class = new Class(this);  

そしてクラスファイルで

public function Class(objectRef:Object) {
    _parentRef = objectRef;
} 

ただし、その参照では、子から親への階層を使用してステップアップする必要もあります。

また、そのクラスをインポートし、直接ファイルパスを使用して、親であるかどうかに関係なく、そのクラス内のメソッドを参照することもできます。

import com.site.Class;
com.site.Class.method();

もちろん、インポートされたクラスを介してメソッドまたはプロパティに直接アクセスしているため、親から子への関係は無関係です。

ここで本当に明白な何かが欠けているように感じます。私は基本的に、これらが親を参照する正しい方法であるかどうかの確認を探しています。もしそうなら、どれが最も理想的ですか、それとも他の何かを見落としていますか?

4

6 に答える 6

7

一般に、子供が親と通信する必要がある場合は、イベントをブロードキャストして通信させることを検討する必要があります。これにより、子が親から分離され、他のクラスが子と連携できるようになります。

親クラスへの参照を子クラスに渡すことはお勧めしません。

これは簡単な例です (これをテスト/コンパイルしたので、タイプミスがあるかもしれません)。

//Child.as
package
{
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class Child extends EventDispatcher
    {
        public function doSomething():void
        {
            var e:Event = new Event(Event.COMPLETE);
            dispatchEvent(e);
        }

        public function foo():void
        {
            trace("foo");
        }
    }
}


//Parent.as
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class Parent extends Sprite
    {
        private var child:Child;
        public function Parent():void
        {
            c = new Child();
            c.addEventListener(Event.COMPLETE, onComplete);
            c.foo();//traces foo

            c.doSomething()
        }

        public function onComplete(e:Event):void
        {
            trace("Child broadcast Event.COMPLETE");
        }

    }
}

ほとんどの場合、カスタム イベントをディスパッチし、データを渡します。

基本的:

親は子への参照を持ち、メソッド呼び出しを介して通信します。子は親への参照を持たず、ディスパッチ イベントを介して (誰とでも) 通信します。

それが役立つことを願っています...

マイク・チェンバーズ

mesh@adobe.com

于 2008-09-15T22:09:49.803 に答える
3

クラスは独自のインスタンスであり、他の何か(この場合は親)との緊密な結合を減らすので、一般的には良いことです。parent.doSomething()のようなことをする場合、doSometing()メソッドを持たないコンテナーでそのクラスを使用することはできません。クラスに必要なものは何でも渡す方が間違いなく良いと思います。そうすれば、クラス内でparent.parentなどを実行する必要がなくなります。

これにより、将来構造を変更したい場合に、新しい参照を渡すのは非常に簡単です。子クラスの実装を変更する必要はまったくありません。

ここにある3番目の選択肢も非常に異なります。最初の2つのようにインスタンスメソッドではなく、クラスレベルの静的メソッドにアクセスします(そのメソッドにアクセスするときにクラスパス全体を入力する必要はありません)。

于 2008-09-13T08:27:47.580 に答える
1

親をインターフェイスとして渡す (そのインターフェイスを実装する任意の親にクラスを含めることができるようにする) か、親がフックできるイベント/関数ポインター/デリゲートとして参照を実装するのが好きです。

于 2008-09-13T08:57:07.993 に答える
1

親オブジェクトへのポインターを子に渡し、そのポインターを子クラスのメンバー変数に格納するという、2番目の方法を常に使用してきました。私には、それが子供が親に連絡する最も簡単な方法のように思えます。

于 2008-09-12T22:12:01.147 に答える
1

私はグローバル クラスをセットアップして、必ずしも子クラスではなく、他のクラスからアクセスする必要があるクラスへの参照を処理するのが好きです。

グローバル クラスは、次のような静的ゲッターとセッターで構成されています。

private static const class:Class;

public static function setClass(_class:Class){
class = _class;
}
public static function getClass(void):Class{
return class;
}

これの良いところは、グローバル クラスから返すクラスをインポートする必要がなく、グローバル クラス自体だけをインポートすることです。

参照する必要があるクラスは、グローバル リストに追加されます。もう 1 つの優れた点は、この中央の場所からイベントを簡単にディスパッチできることです。

ほとんどの場合、クラスを子クラスまたは他のクラスから参照する必要がある場合は、インターフェイスを介して行います。

于 2008-09-15T15:44:52.287 に答える
0

これらのオブジェクトが DisplayList にある場合は、さらにいくつかのオプションがあります。ParentClass と ChildClass がある場合、子クラスでは、リクエストを ParentClass としてキャストすると、親にアクセスできるようです。例えば

ParentClass(parent).parentFunction();

ParentClass がドキュメント クラスである場合、確実に機能することはわかっています。ドキュメント クラスは常に表示リストの最初の項目であるため、これは機能します。

ParentClass(stage.getChildAt(0)).parentFunction();

私の場合、それらは両方とも同じパッケージのメンバーだったので、何もインポートする必要さえありませんでした。すべての状況でテストしたわけではありませんが、必要なときに機能しました。

もちろん、'parent' と 'getChild...' は、これらのオブジェクトが DisplayList にある場合にのみ機能しますが、それで十分です。

于 2009-07-03T01:52:04.360 に答える