2008-09-12 109 views
2

我的問題涉及訪問子對象父對象的最佳實踐。所以我們假設一個類實例化另一個類,那個類實例現在被一個對象引用。從那個子對象中,返回父對象的最好方法是什麼?目前我知道我經常使用的幾種方法,但我不確定A)是否有更好的方法來做到這一點,或B)哪一種方法是更好的做法從子對象引用父對象

第一種方法是使用getDefinitionByName ,它不會實例化該類,但允許訪問公開聲明的任何內容。

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

然後根據其父級到子級別引用該變量。
例如,如果孩子試圖引用類這兩個級別最高的本身:

_class(parent.parent).function(); 

這似乎很好地工作,但你必須知道這對孩子是在比水平您嘗試訪問的父級的級別。

我也可以得到以下語句來將[object ClassName]追蹤到Flash的輸出中。

trace(Class); 

我並不在該行的執行100%,我還沒有它想追尋作爲一種方式來引用當前對象我在以外的對象。

另一種方法我見過使用的簡單的引用傳遞給該到你所創建的類對象,並只是一個構造函數的參數抓住它

var class:Class = new Class(this); 

,然後在類文件

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

該引用還要求您使用子級別向父級別進行備份。

我也可以導入該類,然後使用直接文件路徑引用該類內部的方法,而不管其是否爲父類。

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

當然,由於我通過導入的類直接訪問方法或屬性,所以父對子關係是無關緊要的。

我只是覺得我錯過了這裏真正明顯的東西。我基本上是在尋找確認,如果這些是引用父母的正確方法,並且如果是的話,哪一個是最理想的,還是我過分看待別的東西?

+0

我很確定你不能有一個Class類,但我知道你的意思。 – Iain 2009-07-03 08:48:45

回答

3

將類作爲自己的實例並減少對其他事物的緊密耦合通常是很好的(因爲在這種情況下,它是父類)。如果你做了一些像parent.doSomething()這樣的事情,那麼在不具有doSometing()方法的容器中使用該類是不可能的。我認爲傳入任何類可能需要的東西絕對會更好,然後在課程內部不再需要做任何parent.parent等。

如果您將來希望更改結構,只需傳入新參考文件即可;兒童班的實施並不一定要改變。

您在這裏的第三種選擇也非常不同,它訪問一個類級別的靜態方法(您不必在訪問該方法時鍵入整個類路徑),而不是前兩個實例方法。

+0

是的第三個替代方案我提到,因爲我正在導入類沒有父母與子女的關係,謝謝! – vanhornRF 2008-09-14 20:28:49

1

我一直使用第二種方法,將一個指向父對象的指針傳遞給子對象,並將該指針存儲在子對象的成員變量中。對我來說,這似乎是孩子與父母溝通的最簡單方法。

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 2008-09-15 16:22:42

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

    } 
} 

在大多數情況下,您會派遣自定義事件並傳遞數據。

基本上:

家長引用Child並通過方法調用進行通信。 孩子沒有對父母的引用,並通過調度事件(向任何人)傳達信息。

希望幫助...

邁克室

[email protected]

0

如果這些對象在顯示列表,然後你有一些更多的選擇。如果我有一個ParentClass和一個ChildClass,在子類中,如果您將請求轉換爲ParentClass,您似乎可以訪問父級。例如

ParentClass(parent).parentFunction(); 

我知道肯定它的作品,如果ParentClass是文檔類。由於文檔類總是在顯示列表中的第一個項目,這個工程:

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

對我來說,他們是同一個包的成員,所以我甚至沒有需要進口什麼。我沒有在任何情況下對它進行測試,但是當我需要它時它就起作用了。

當然'parent'和'getChild ...'只有在這些對象位於DisplayList中時才起作用,但這對我來說已經足夠好了。