2009-09-07 27 views
1

使用Actionscript 3.0中的顯示列表,我經常傾向於讓孩子將自己添加到他們的父母,因爲他們通常已經有了這個引用。這將是這樣的:從孩子調用addChild()?孩子加入自己?

_myParent.addChild(this);

或移動時...

this.parent.removeChild(this);

通過addChild()語法的措辭,這種方式似乎倒退 - 顧名思義應該是唯一一個調用該函數的人。

  • 有沒有其他人這樣做?
  • 或者這看起來倒退和混亂?
  • 也許我正在陷入我不應該陷入的境地?

這似乎是一個違反職責因爲父母應該是唯一一個呼籲自己的方法和負責自己的顯示列表。

+0

對我來說這似乎是完全合理的...... – RCIX 2009-09-07 06:28:53

+0

我根本沒有發現任何錯誤 - 至少,這與調用ObjectA.applyMethodTo(ObjectB)沒有什麼不同。哪個對象應該知道哪些其他對象與哪個對象正交的問題,以及哪個對象是孩子。 – fenomas 2009-09-08 06:17:18

回答

1

只要孩子提及其父母,你就會謹慎。雖然它沒有違反與面向對象相關的任何規則,但它確實開始使您的結構更難於維護和理解。

ActionScript 3.0中的顯示列表設計用於在與子級進行交互時使用方法調用,以及每當孩子做出可能對父級有趣的事情時發生的事件(有時冒泡)。

這個方向可以幫助我們讓孩子們不知道他們在層次結構中的位置,並將它們設計得更像通用(可重用)組件。通常,ActionScript顯示列表在從父到子移動時從更多到更不特定。例如,一個CreditCardForm可能包含一個TextInput控件。

0

雖然這不是一個好習慣,但this.parent.removeChild(this);有時很方便(取決於你的設計) - 我記得在AS編碼的早期階段就這麼做了......然後我被告知它不是一個好的做法它和我不再使用它了。

關於_myParent.addChild(this); - 我通常不會將父對象傳遞給子構造函數/方法...我認爲這種做法的根源在於AS2。是的,它看起來奇怪/令人困惑,因爲它不是AS3的方式。

+0

將父項(或任何依賴對象)傳遞給子項是一種非常流行的稱爲「依賴注入」的OOP技術。 你有任何消息來源或更多的解釋,爲什麼這些技術不是好的做法? – Pup 2009-09-08 18:20:40

0

對我來說這似乎不好,因爲父母的狀態是它的狀態,它打破了封裝。

讓我們想一個簡單的情況,當你需要實現拖放。可以這樣做:

  1. 告訴孩子將他從他的父母中移除。然後告訴孩子將他添加到新的父母身上。父母甚至不知道這一點:-)。

  2. 告訴家長 - 我需要你的孩子。他會移除那個孩子。然後告訴其他父母:從現在開始,這個孩子是你的。

    第二種方法似乎更合理的給我,因爲如果你需要拒絕一些孩子(家長可以t have some types of children, or need to do some actions when you are getting new children, like prepare a bedroom, or buy some toys), you會是必須從你的子類調用了這一切。而這將需要顯示你所有的父母s implementation for that. Sure it can be done via generic interface of parent, but I think it更加容易去此委託責任,父母和子女提供。每位家長都知道他應該做什麼來添加這個孩子。

+0

那麼,你的意思是「讓父母決定」?因爲父母擁有自己的孩子,並且必須控制他們,對嗎? – Pup 2009-09-07 17:33:09

0

_myParent.addChild(this);

讓我們打破這...

  • _myParent
    這是對其他對象,這恰好是該對象的顯示列表中的父級的引用。有一個對象引用其父對象的原因很多。他們在結構上密切相關,因此可能有理由相互溝通。因此,對顯示列表父項的引用不是問題。

  • addChild()
    調用其父公共方法之一不是問題。這是什麼方法。如果這是父母的財產,那將是侵入性的。調用這個方法不會直接改變父對象的狀態。家長將自行決定執行此功能。

  • this
    事實上,這種情況下的論點恰好是自我指涉的,這是一個巧合。如果參數是一些微不足道的東西,比如new Shape(),那麼它看起來不那麼尷尬。但是,由於一個物體本質上是「增加自身」的,所以它看起來就像是一個由自己的靴子提升自己的人。但是,這不是現實生活;它是計算機編程,當它的語法讀取時它是有意義的。

的Actionscript需要命名功能東西。把孩子帶到顯示列表上的另一種方法可能是addToParent(),當試圖從父母中添加一個孩子時 - _myChild.addToParent(this)仍然會有相同的尷尬效果。

所以,雖然沒有對象在這個尷尬的困境受到侵犯,有寫addChild()語句更自然的方式,那就是從父母添加子,而不是周圍的其他方法,因爲這是奠定了訂單由語法降低。所以,儘量使用自然的方式,當失敗時,另一種方式仍然可以,只是有點尷尬。