1. 程式人生 > >類別與類擴充套件//類別與繼承

類別與類擴充套件//類別與繼承

類別

1,在不需要繼承的情況下可以擴充套件類的功能;

2,無法向類中新增新的例項變數,類別沒有位置容納例項變數;

(注意)如果非要在類別中加成員變數,可以使用@dynamic來彌補這種不足;

3,名稱衝突:當類別中的方法與原始類方法名稱衝突,類別具有更高的優先順序。

(補充:在蘋果官方文件中的描述是,當方法名重名的時候,在執行的時候不知道會呼叫哪個方法。實際上,這個應該是有規則可循的。我建了一個工程,給NSString增加了一個類別,裡面重寫了lengthsubstringFromIndex方法。length方法是NSString的方法,substringFromIndexNSString

的一個類別裡的方法。當我呼叫者兩個方法時,發現呼叫length的時候返回的是系統的那個呼叫,而不是我自己實現。而當呼叫substringFromIndex時,呼叫的則是我實現的方法。於是我推斷當系統類中的方法名與自己定義的類別裡的方法重名時,會呼叫系統的方法名,而當自定義類別中的方法名與系統類別中的方法重名時,會使用自定義類別中的方法的實現。為了驗證這一推斷,我又繼續增加了NSArray的類別來進行測試,測試結果正如我推斷的一樣。即使是這樣,我們也不能確定這個結論就是正確的。)

類擴充套件(匿名類別)

1,Extension中的方法必須在@implementation中實現,否則編譯會報錯;

2,把程式碼寫在原始類的的.m檔案中;

3,括號裡不需要寫名字;

4,可以再類擴充套件中定義屬性以及私有變數,私有方法;

5,類擴充套件只能針對自定義的類,不能給系統類增加類擴充套件;

繼承與類別

繼承

1,這個是面嚮物件語言都有的一個特性,子類會繼承父類的方法和屬性;

類別做不到,只能使用繼承;

1),新擴充套件的方法與原方法同名,但是還需要使用父類的實現,類別會覆蓋;

2),擴充套件類的屬性,這個類別也做不到;

類別

1,針對系統提供的一些類,例如:NSString,NSArray等類,系統本身不提倡使用繼承去擴充套件方法,因為這些類內部實現方法對繼承有限制;

2,類別的使用,可以提高可維護性,簡化對單個原始檔的管理;

3,不能修改和刪除原始類中的方法;