2015-02-06 42 views

回答

2

繼承在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的子類。

同樣,雖然子類UIViewCALayer有點常見,但也可以使用「庫」視圖和圖層,並通過添加子組件來構建它們。這是HAS-A方法。

基金會的IS-A非常少。除了NSObject以外,您很少會將基礎課程進行子類化。考慮NSAttributedString。它沒有子類NSString。它NSString。這是基金會做事的常用方式。您幾乎從不創建自己的子類NSStringNSArray,NSDate,NSNumber或基金會以外的任何其他常見類型。你將它們結合起來。

+0

因此,將屬性添加到另一個對象是組成模式的一部分?即。 '@property(...)UITextField * loginTextField'被添加到一個UIViewController被認爲是組成?如果是的話,我沒有看到繼承這種做法的另一種方式。或者這僅僅是組成結尾的一個極端例子? – Ramsel 2015-02-06 19:54:00

+0

是的,屬性絕對是作曲的例子。在OOP中避免構圖是非常困難的。它是範式的基本組成部分,甚至超過子類(基於原型的OOP,如JavaScript,甚至沒有子類化)。視圖控制器是系統中最複雜的部分之一,對構圖和繼承都有重要的用處,所以很難得到清晰的圖像。從思考簡單的事情開始,如文本字段。考慮如何使用NumberOnlyTextFieldDelegate構建NumberOnlyTextField vs。 – 2015-02-06 20:20:08