2011-04-06 152 views
-1

我對OO相當陌生。如果我有兩個需要交換數據的A和B類,或者調用對方的方法,我需要能夠從類A訪問類B的實例。我是否應該將實例對象的地址保存在全局變量中?我應該指定一個(單例)主類,並且使(指向)主類的A和B屬性的實例? (AppDelegate浮現在腦海。)如何從另一個班級訪問班級?

是否有一個直接的書面方式來實現呢?不知何故,我在這裏錯過了一些「最佳做法」。我查看了Apple的例子,但沒有找到答案。

編輯:由於我相當新的MVC設計模式,我的問題基本上是「誰創造誰」?

我們在這裏討論一個音頻播放器。 1.當用戶選擇一首歌曲時,UI會通過創建一個viewController來顯示其波形,該viewController會創建相應的視圖。 2.當用戶點擊播放時,用戶界面通過在波形上覆蓋新視圖來播放歌曲時顯示時間線。現在,後一種視圖需要來自波形顯示viewController的一些信息。現在,我在appDelegate的實例變量中存儲一個指向viewController的指針。這工作,但感覺非常奇怪。

我是否應該將兩個課程所需的信息外包給每個班級都可以輕鬆訪問的第三個實體?

回答

3

類不是簡單的代碼部門。它們是創建對象的模板,您應該將其視爲程序中的角色,在其責任區域內(您定義的內容 - 您決定每個對象的作用)進行相互作用。

雖然您可以像處理對象一樣處理類,但類通常不會彼此交談。大多數情況下,您將創建並使用這些類的實例 - 這就是我們通常所說的「對象」 - 並且讓這些實例相互交流。一個對象發送另一條消息,告訴接收者做某件事或更改接收者的屬性之一。這些消息是程序對象之間的交互。

方括號中的那些奇怪的表達式是消息表達式。幾乎你所做的任何一個類或對象都會涉及一條或多條消息。您可以將消息發送到與對象相同的類,並且類可以像對象一樣發送消息。在可可和Cocoa Touch中,通常有模型對象,視圖對象,控制器對象,數據對象(如NSString,NS/UIImage和NSURL)以及輔助對象(如NSFileManager)。您爲應用程序編寫的類將主要是模型,視圖和控制器對象(MVC)。該模型表示(模型)用戶將看到他們自己操縱的內容;該視圖將模型顯示給用戶;控制器實現了邏輯並確保模型被保存到永久存儲中並從永久存儲中加載。

欲瞭解更多信息,請參閱Object-Oriented Programming in Objective-CCocoa Fundamentals Guide

因爲我對於MVC設計模式還是比較陌生的,所以我的問題基本上是「誰創造了誰」?

控制器創建並加載模型,並加載視圖,並將模型傳遞給視圖以進行顯示。某些控制器也可能創建其他控制器。

從程序的單根(通常是應用程序對象)向下通過控制器到模型和視圖中的葉對象,保持所有權的直接樹形圖是很好的。如果兩個物體彼此擁有,那就是一個問題。如果一個對象不屬於它自己的類(單例)之外的任何東西,那通常也是一個問題 - 您需要更多地考慮代碼所屬的位置。 (Helper對象是主要的異常,其中大多數是單例,再次以NSFileManager爲例,但它們並不多見。)

+0

哇,謝謝澄清。要回到我手邊的問題,你的意思是,我的模型和我的觀點不應該首先與對方交談?一切都應該通過控制器發送。 – 2011-04-07 12:29:36

+0

@JoeVölker:對。使用標準視圖時,控制器應將數據對象從模型傳遞到視圖並返回。當使用自定義視圖時,我通常會給我的自定義視圖顯示和編輯模型對象的屬性。不同之處在於標準視圖被設計爲通用的,可以在任何應用程序中處理幾乎任何模型,而我將爲特定模型設計自定義視圖。該模型從不與觀點對話,應儘可能少地儘可能與控制器交談。 – 2011-04-08 19:58:36

1

您應該決定一個類是否可以是另一個類的對象(封裝),或者是否有一個類可以繼承其他類(繼承)。如果這兩個都不是一個選項,那麼也許你可以讓一個類(或其某些成員)是靜態的?

2

進一步的情況分析需要更多的信息。首先,您應該更多地指定類之間的關係,以及通過交換數據確切地說明您的意思。

應該避免單身。如果你想交換信息,通常通過某種方法或構造函數將類A的實例提供給類B的實例就足夠了。然後B的實例能夠調用A實例的公共方法(並訪問公共屬性)。

通過搜索「設計模式」可以學習一點「最佳實踐」。

+0

更多信息:我的主視圖的兩個子視圖代表我的數據。一個正在顯示一個波形,另一個正在顯示一個流經它的時間線。他們需要訪問一些常用數據。現在,子視圖在需要時被實例化並創建它們自己的表示,即,波形視圖類從其音頻數據的drawRect中創建波形圖形。 – 2011-04-07 07:10:56

+0

我認爲這取決於_common data_的類型。如果它們與輸入數據相關,我會創建表示數據的不同對象並將其提供給兩個視圖。如果它與視圖本身有關,也許你可以將兩個視圖包裝到一個容器中,或者以不同的方式將它們統一起來。或者,也許你會來更聰明的東西... – Binus 2011-04-08 00:18:25

0

感謝您的貢獻。另外,我發現有關this page的信息非常有用。它以親身實踐的方式和實用的語言闡述了可可的MCV考量。