2012-02-24 50 views
1

好吧,這也許是不可能的,但我有一個類(稱爲CompositeView),這是一個子類UIView。它使用一些核心圖形工作來產生基於某些選項的自定義背景。不是一個龐大的班級,而是隨着我的要求變化/增加/增加而增長。我遇到的問題是我在很多不同的地方使用這門課。但是在一些地方,我需要它是UIScrollView的一個子類,而不是UIView。有趣的是,我可以簡單地改變超類,這一切都很好。但是,我不僅不希望所有的其他觀點都成爲UIScrollView,還會干擾其中一些觀點的運作。所以我需要一個類,有時是UIScrollView的子類,有時候是UIView的子類。子類的UIView VS UIScrollView的

現在,我真的複製了CompositeView的所有接口/實現,將類名更改爲CompositeScrollView,並將其繼承改爲UIScrollView。它工作正常,但現在我有兩套完全相同的代碼,只是繼承了不同的父類。這使得他們兩人都感到痛苦。

有沒有更好的方式來做到這一點?

+1

爲什麼你需要它的UIScrollView或UIView的(子類UIScrollView的時候已經是一個子類UIView的)?關於你想要完成的更多細節是需要的。 – 2012-02-24 21:27:20

回答

4

單繼承語言強迫你使用授權。您需要將添加的功能分解到您爲派生類實例化的單獨類中,然後將派生類的轉發填充寫入實例。這是痛苦的。目標C具有描述添加函數(任何不是覆蓋的墊片)的協議,然後如果你沒有編寫墊片,那麼編譯器會出錯......你仍然必須手動完成。

目標C也有類別,使您可以擴展現有的類,但這些不能被共享(你必須單獨擴展每個類),所以它並不能真正幫助。

+0

是的,實際上這可能是迄今爲止最好的主意。複合視圖實際上使用核心圖形來創建一個UIImage,它將其添加到共享緩存(由具有相同選項的所有視圖共享)。所有的視圖都是在drawInRect中繪製圖像。我可能會減輕很多。我會讓對象創建更復雜一些,但可能是值得的。 – 2012-02-24 22:42:05

+0

對UIView的一個類別可以工作,實際上,但是他們不允許性質,所以,除非您的附加功能添加任何新的狀態(只是行爲),你可以不使用它們。 +1! – 2012-02-25 04:34:19

+0

是啊,我也沒有想他想添加到所有視圖,因此想使用類作爲混入被應用到從的UIView和UIScrollView中派生他的課。但是,由於類別本身不能應用於多個類別,因此無法實現(甚至在查看添加的伊娃類別之前)。 – smparkes 2012-02-25 05:41:13

-1

是的,您可能有興趣使用類羣集。這可以產生對象,讓我們說MyCompositeClass將產生MyCompositeScrollClass對象或MyCompositeViewClass對象。

蘋果使用類簇中的NSArray很多,例如,當你使用它,你的操作不同對象的幕後。不同的是基於陣列的大小,例如對於一些小陣列NSArray將實例化一個專門針對小數據結構的類,等等......

這樣做的好處是具有良好的性能和複雜性完全由用戶通過這個類集羣的概念來隱藏。

我請你閱讀一些文件,它可能是更容易理解。 https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html

希望這是有幫助:)

+0

我不知道是誰把-1 ...但是,如果他或她可以詳細說說我很想知道是我的錯.. – Ganzolo 2012-02-25 11:59:50

1

做的最好的事情是不可能的,當然是:從你UIView子類繼承UIScrollView

@smparkes的回答是不錯的,但有時你想要的代表團沒有做,或者是太不方便了。在這種情況下,它可能是後者。

考慮使用的東西作爲UIScrollView無處不在,但打破了你不需要的功能。UIScrollView情況下采取行動酷似UIView實例 - 嗯,他們是UIView實例 - 所以你可能只是解決這個簡單的問題,「有一些他們的操作干擾」和你自己的方式。關閉變焦,關閉滾動,等等......

不幸的是,這是單繼承語言的現實。無論你做什麼,都不要試圖用改變isa之類的任何東西來解決這個問題。如果你有任何成功,它將不會持久。 Objective-C只有輕微的動態性,並且不允許普通程序員認真使用這種類型的東西。

+0

+1,這似乎是最明智的事情:) – Julian 2012-02-24 22:06:39

+1

FWIW,我可能會首先嚐試禁用所有的'UIScrollView'。這就是說,'UIScrollView'是野獸,我也可能認爲值得額外的墊片代碼來避免它們,除非我真的需要它們。 – smparkes 2012-02-24 22:17:55

+0

我曾考慮禁用UIScrollView,但事實是,UIScrollView增加了一些我不想要的重量。我最初編寫了複合視圖來加速一些較慢設備上的動畫(它的確行動過)。使用UIScrollView有點失敗(不夠多,但足夠)。 – 2012-02-24 22:35:51

0

好吧,也許這完全是瘋狂的,但ISA切換的選項?

object->isa = [SomeClass class]; 

參見:Objective-C: How to change the class of an object at runtime?

如果您實現一個UIView子類是知道如何它的ISA指針切換到UIScrollView的子類,你只需要處理一類,甚至可以動態地決定哪些您在運行時需要的視圖。

請注意,這是純粹的理論。我從來沒有使用ISA開關在現場代碼,我個人不認爲它使一個好的設計:P

編輯: 但同樣,它不減少任何裁員...... 我讀過更多的進入正題位和它確實似乎沒有推薦(老對象的存儲結構保持不變,如)

+0

只有當兩個類具有相同的內存佈局時,纔會起作用。不太可能UIView與UIScrollView。 – 2012-02-24 22:10:15

+0

他們不...... UIScrollView在內存上更重。 – 2012-02-24 22:36:33