2008-09-12 16 views
2

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

最初の方法は、getDefinitionByNameそれはそのクラスをインスタンス化せず、公に宣言されたものの中の何かへのアクセスを許可します。

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

次に、その変数をその親から子の階層に基づいて参照します。
例、子が自身の二つのレベルアップのクラス参照しようとした場合:

_class(parent.parent).function(); 

これは正常に動作するようだが、あなたは子供がと比較さにするレベルを知るために必要とされるがあなたがアクセスしようとしている親のレベル。

[オブジェクトClassName]をFlashの出力にトレースするための次の文を取得することもできます。

trace(Class); 

私は私にいる現在のオブジェクトの外のオブジェクトを参照する方法として、それをpersuedていない、その行の実装に100%ではないです。

別の方法私は「が使用さ見てきただけで

public function Class(objectRef:Object) { 
    _parentRef = objectRef; 
} 
を作成しているクラスのオブジェクトにこのへの参照を渡すだけコンストラクタの引数

var class:Class = new Class(this); 

でそれをキャッチして、クラスファイルにすることです

この参照でも、子階層から親階層を使用してバックアップを取る必要があります。

また、そのクラスをインポートしてから、その直接のファイルパスを使用して、親の有無にかかわらず、そのクラスのメソッドを参照することもできます。

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

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

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

+0

私はあなたがクラスと呼ばれるクラスを持つことができないと確信していますが、私はあなたが意味するものを知っています。 – Iain

答えて

3

クラスを自分のインスタンスとして持ち、他のものと緊密に結合するのを減らすのが一般的には良いです(この場合は親です)。 parent.doSomething()のようなことをすると、doSometing()メソッドを持たないコンテナでそのクラスを使用することはできません。クラスが必要としているものはすべて渡すことをお勧めします。クラス内では、もうparent.parentなどを行う必要はありません。

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

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

+0

第3の選択肢のためのYea私はクラスをインポートしているので、親子関係はありません。 – vanhornRF

1

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

1

私は親をインターフェースとして渡すことができます(そのクラスはそのインターフェースを実装している親に含めることができます)。親がフックできるイベント/関数ポインタ/代理人として参照を実装します。

1

私はグローバルクラスを設定して、他のクラスからアクセスする必要のあるクラスへの参照を処理するのが好きです。

グローバルクラスは、単純にそうような静的なgetterとsetterで構成されています

private static const class:Class; 

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

このことについての素晴らしい事は、あなたがグローバルクラスから戻ってきているクラスをインポートする必要がないことです、ちょうどグローバルクラスそのもの。

参照が必要なクラス自体がグローバルリストに追加されます。 他のすばらしいことは、この集中管理された場所から簡単にイベントを送信できることです。

ほとんどの場合、クラスが子クラスまたは他のクラスによって参照される必要がある場合、私はインターフェイスを通してそれを行います。

+0

上記で説明したグローバルクラスでは、アクセスするクラスと同じパッケージフォルダ内にある場合は、それをインポートする必要もなく、ClassName.setClass(Class)などのものでアクセスできる必要があります。 – vanhornRF

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

    } 
} 

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

基本的に:

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

希望...

マイク室

[email protected]

0

これらのオブジェクトはDISPLAYLISTにある場合、あなたには、いくつかのより多くのオプションを持っています。子クラスでParentClassとChildClassがある場合、ParentClassとして要求をキャストすると、親にアクセスできるように見えます。例えば

ParentClass(parent).parentFunction(); 

私はParentClassがドキュメントクラスであることを確認しています。ドキュメントクラスが常に表示リストの最初の項目であるので、これは動作します。私の場合は

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

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

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

関連する問題