2012-09-18 31 views
4

今天我做了一些有點討厭的事情。使用Objective-C類別避免編譯錯誤

我們所有的視圖控制器都從兩個不同的父視圖控制器繼承,比如XXXViewController和YYYViewController。 XXXViewController依次繼承TrackedUIViewController,這是Google AnalyticsSDK中提供的一個類,所以您的所有視圖控制器都可以繼承並輕鬆跟蹤它們。

但是,YYYViewController繼承了不同類型的視圖控制器。嗯,這是一個開源的代碼,我真的不想改變。

這裏有什麼問題嗎?我們無法跟蹤任何YYYViewController子級,因爲我們無法訪問TrackedViewController中提供的方法,因爲它們是私有的。

我不想修改Google AnalyticsSDK中提供的來源。那麼我做了什麼?創建一個公開這些方法的類別,以避免編譯錯誤。

這個明顯的缺點是GA源代碼改變了它可能會中斷,但它會很容易被檢測到。

我想知道我可能面臨的其他問題,如果你們能想到更好的方法。

謝謝

回答

3

你可以在YYYViewController的繼承鏈上繼續查看它繼承的類。如果它是UIViewController,只需將源代碼中的特定超類更改爲TrackedUIViewController即可。

爲更好地理解的示例:假設YYYViewController繼承自ZZZViewController,其繼承自UIViewController。現在,您可以將ZZZViewController的超類從UIViewController更改爲TrackedUIViewController - 由於TrackedUIViewController繼承自UIViewController,因此不會丟失任何功能,但您的整個YYYViewController類將會變得可追蹤。

希望這有助於:-)

+0

問題是,這個YYYViewController是一個開源的組件,我不想修改:) –

+0

@frowing你不能這樣做,否則。請參閱將單詞'UIViewController'更改爲'TrackableUIViewController'不應該受到傷害。正如我所提到的,你不會失去任何功能...... – 2012-09-18 15:21:48

0

您已經提到使用無證的API的最大風險:更改API是無法控制的,並可能會破壞你的邏輯,例如,如果被刪除的方法/重命名,或他們的行爲將停止符合期望。從純粹的技術角度來看,我看不出更多的問題,因爲在Objective-C中,所有的方法都是公開的。只要他們繼續存在,你可以繼續給他們打電話。

0

我會說根本問題是過度的子類化。保持視圖控制器層次結構淺。使用組合而不是子類。如果您必須繼承子類,請確保類提供的功能可以由其子類打開&。