2013-07-05 209 views
0

我正在處理一個圖塊編輯器。在編輯器中,您可以加載瓦片貼圖。每個瓷磚地圖可以有多個圖層。瓷磚地圖有它的圖層列表。我現在需要圖層類中的圖塊地圖屬性(比如瓦片寬度/高度等)。我現在問自己最好的辦法是什麼。從子類中訪問父屬性的最佳方法

  1. 我能在層類引入tilemap的屬性的雙向關係,使我有機會獲得的一切,我從那裏需要。但是,我將不得不照顧雙方的關係。我可以用構造函數給圖層類提供所有需要的屬性,但它們基本上變成了圖層屬性(也就是說,它們是每個圖層的不同對象)。

  2. 與2相同,但將屬性賦予具有「ref」參數的圖層。

  3. 我可以做一個叫做TileMapLayerProperties的類,在這裏我把所有的屬性都放進去然後把對象傳遞給圖層類。好處是所有的屬性都是一樣的,只有tileMapLayerProperties引用是每個實例。另一個優點是層構造器的「定義」變得更短。

所以,任何建議/技巧將不勝感激。

回答

1

雙向關聯(1)可能正常或不正常,這取決於瓦片地圖包含的屬性和方法以及圖層應該能夠知道和訪問的內容。如果瓦片貼圖具有DeleteAllLayers方法,並且圖層不應該能夠調用它,則圖層無法直接訪問其父項。

創建專用屬性對象(4)似乎對我來說更加乾淨。這樣,你有一個對象,包含所有必要的信息,你可以傳遞,但它不包含更多,尤其是它不允許調用破壞性方法等。

將屬性傳遞給構造函數(2)是類似的到(4),但更詳細和更少的面向對象。當你有1或2個屬性時很好,但有很多屬性會變得醜陋和難以維護。

但還有另外一個問題:如果屬性是不可變類型(例如int,string),那麼圖層不會看到在地圖中所做的更改。他們只看到他們的私人副本!

我不明白(3)。 ref關鍵字如何更改(2)?它只允許被調用者更改調用者傳遞的變量的值。或者你是指具有參考類型的對象?

另一種解決方案

接口將是另一種方式來解決這個問題。您可以創建一個提供所有屬性並將其傳遞給圖層的構造函數的接口。該映射既可以實現接口本身,也可以包含實現接口的對象TileMapLayerProperties。但圖層不需要知道這一點。

+0

你是對的,屬性是不可變的,它們是int的,所以它們是複製的,這就是爲什麼我寫這部分(應該更加精確)「,但它們基本上成爲圖層屬性(又名它們是每個圖層的不同對象)」。有了ref,我想給圖層提供參考,所以當我在地圖上改變它們時,它們會在圖層中發生變化。您的界面建議聽起來很有趣,可能是最好的解決方案。 –

+0

我結束了使用選項4 – TruthOf42

0

選項2將適用於您正在嘗試執行的操作,並且您可能不需要包含'ref'關鍵字。 我很好奇,你想從子類中訪問什麼樣的數據成員?如果他們是集合,那麼你可能不需要'ref'關鍵字。 另一種選擇是將父類設爲靜態,但我不確定這是否是您要查找的結果。你能一次加載多個瓷磚地圖嗎?如果不是,請考慮靜態類選項。

+0

'static'在這裏完全沒有必要。即使 - 現在 - 一次只有一張地圖,這可能會稍後改變,並需要大量更改。除非確實需要,否則應該避免單身。 –

+0

謝謝你對此的擴展。我明白這不是最好的選擇,但如果Biene以後不擔心修改代碼,那麼這將是一個選擇。 – Th3BFG

0

我認爲選項是3更好。您可以將ParentClass的引用傳遞給ChildClass,並且可以直接訪問所有公共屬性。我建議它更好,因爲無論從ChildClass還是ParentClass開始,所有其他layers都會繼承這些更改。

+0

這聽起來更像我1。我想避免這可能帶來的問題的原因。 –