我試圖更好地理解構圖的設計原理。 UIKit或Foundation框架中是否有這樣的例子?基礎或UIKit構圖示例
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKit_Framework/
從我的經驗,並思考這個問題之前明確,似乎繼承是這兩個框架的主要模式。
我試圖更好地理解構圖的設計原理。 UIKit或Foundation框架中是否有這樣的例子?基礎或UIKit構圖示例
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKit_Framework/
從我的經驗,並思考這個問題之前明確,似乎繼承是這兩個框架的主要模式。
繼承在Foundation中很少見,並不是UIKit的主要模式。在這兩種情況下,構圖更爲常見。
繼承和組成之間的差異通常表示爲IS-A與HAS-A。 IS-A的方法是子類。 HAS-A方法是委託。
考慮一個文本字段,您只想接受某些字符。在IS-A風格中,您可以繼承UITextField
。這在iOS中並不常見。相反,你傳遞一個委託(符合<UITextFieldDelegate>
的任何內容),文本字段在需要時進行諮詢。這是一種HAS-A方法。文本字段「有一個」委託。可以考慮UITableView
。你想製作一張歌曲表。在IS-A(繼承)方法中,您可以繼承UITableView
並創建SongsTableView
。在HAS-A(組合)方法中,您可以創建一些其他對象(一個SongsDataSource
)並將其提供給一個UITableView
。在這種情況下,UIKit使用兩者中的一小部分;您給UITableView
一個數據源,但該數據源通常(但不是必需是)UITableViewController
的子類。
同樣,雖然子類UIView
或CALayer
有點常見,但也可以使用「庫」視圖和圖層,並通過添加子組件來構建它們。這是HAS-A方法。
基金會的IS-A非常少。除了NSObject
以外,您很少會將基礎課程進行子類化。考慮NSAttributedString
。它沒有子類NSString
。它有和NSString
。這是基金會做事的常用方式。您幾乎從不創建自己的子類NSString
,NSArray
,NSDate
,NSNumber
或基金會以外的任何其他常見類型。你將它們結合起來。
也許我收到了你的問題錯了,但也許這就是你要找的內容:
這裏simular問題上的SO:
What Design Patterns are used on iOS other than MVC?
而這裏的格局不錯描述也許讓你更好地瞭解它:
因此,將屬性添加到另一個對象是組成模式的一部分?即。 '@property(...)UITextField * loginTextField'被添加到一個UIViewController被認爲是組成?如果是的話,我沒有看到繼承這種做法的另一種方式。或者這僅僅是組成結尾的一個極端例子? – Ramsel 2015-02-06 19:54:00
是的,屬性絕對是作曲的例子。在OOP中避免構圖是非常困難的。它是範式的基本組成部分,甚至超過子類(基於原型的OOP,如JavaScript,甚至沒有子類化)。視圖控制器是系統中最複雜的部分之一,對構圖和繼承都有重要的用處,所以很難得到清晰的圖像。從思考簡單的事情開始,如文本字段。考慮如何使用NumberOnlyTextFieldDelegate構建NumberOnlyTextField vs。 – 2015-02-06 20:20:08