iOS中的抽象基類和協(xié)議

抽象基類

最開始的時候覺得有沒有什么辦法可以使得oc中也能夠有抽象基類,于是想了很多辦法,比如說斷言和異常,但是感覺自己對編程的認識程度不深,覺得還有沒有別的方案來實現(xiàn),一直查了很多資料都沒有更優(yōu)方案的實現(xiàn),有個小伙伴說他在sunnyxxx大神里面好像有看到過,然后給我說,應該是在方法后面寫一個宏:

// 注意:父類中的方法加`NS_REQUIRES_SUPER`,子類重寫才有警告提示 
- (void)prepare NS_REQUIRES_SUPER;

開始的時候我以為是必須要重寫父類方法的警告,后面寫上去才發(fā)現(xiàn)應該描述為,必須要調用父類的這個方法進行初始化操作;

再然后,我也沒辦法就放棄了抽象基類的想法,后面我看到Masnory的作者在編寫MASConstraint抽象基類的時候,也是用了斷言的辦法:

- (id)init {
    NSAssert(![self isMemberOfClass:[MASConstraint class]], @"MASConstraint is an abstract class, you should not instantiate it directly.");
    return [super init];
}

然后在需要重寫的抽象方法里面加上一個宏的調用:

#define MASMethodNotImplemented() \
    @throw [NSException exceptionWithName:NSInternalInconsistencyException \
                                   reason:[NSString stringWithFormat:@"You must override %@ in a subclass.", NSStringFromSelector(_cmd)] \
                                 userInfo:nil]

這樣就能想其他語言一樣定義了一個抽象基類了,但是我還是在想有沒有什么辦法,可以讓程序在編譯過程中就提示該類是抽象基類,必須重寫公開的方法,如果朋友們有什么特殊的獨門秘訣希望能和我分享一下,謝謝~

協(xié)議

協(xié)議在其他語言中也有被稱為接口之意,在iOS當中有此協(xié)議和代理之分,在某篇文章中看過一句話大概是這樣說的"協(xié)議這么好用的設計模式,你們居然只用來傳值太可惜了",原文比較偏激我就和諧一下吧.其實面向協(xié)議編程是一種提高代碼健壯性的方法之一,在設計模式當中,其實很多地方都會用到面向協(xié)議這個概念.

那么,面向協(xié)議有什么好處呢?其中最明顯的好處就是針對接口,而不是針對實現(xiàn)去編程,由于我們的業(yè)務可能有很多改動的需要,所以如果只是針對實現(xiàn)去編程的話,可能業(yè)務擴展或者修改的時候,我們就要修改更多的內容去適應變動,比如原來是使用AFN作為網絡請求的庫,現(xiàn)在領導說要用ASI,這個時候,如果當初寫的是面向接口編程的話,修改起來可能就只需要修改實現(xiàn)類就可以了.協(xié)議能夠大大降低程序的耦合度.

#import <Foundation/Foundation.h>
@class SEContext;
@protocol SEOneDayState <NSObject>
-(void)handle:(SEContext*)context;
@end

@protocol是聲明協(xié)議的方法,里面的方法有@required(必須實現(xiàn))和@optional(可選實現(xiàn))

協(xié)議和抽象基類的區(qū)別于聯(lián)系

  1. 協(xié)議和抽象基類都需要子類重寫方法
  2. 推翻第一條結論,由于抽象基類可以抽取高度相同的方法避免重寫多寫(一般成為默認行為),所以抽象基類重復使用的代碼部分可以不重寫;
  3. 抽象基類可以有私有方法(基于第2條,可以抽取高度相同的方法);協(xié)議作為對外接口,一般都是公開方法,
  4. 協(xié)議沒有實現(xiàn),都是聲明;抽象基類可以有實現(xiàn),需要子類重寫的方法請拋異臣苯模或者斷言給使用者.
  5. 抽象基類和子類是繼承關系,協(xié)議和類是聲明關系,由于OC中類繼承是單繼承,而可以同時使用多個協(xié)議,所以各有各的優(yōu)點.
  6. 抽象類和接口都不能直接實例化匾寝,如果要實例化拉庶,抽象類變量必須指向實現(xiàn)所有抽象方法的子類對象(面向對象三大特性之一)咨演,接口變量必須指向實現(xiàn)所有接口方法的類對象(如:** id<Eatting,running> **)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蕾羊,一起剝皮案震驚了整個濱河市误算,隨后出現(xiàn)的幾起案子聘裁,更是在濱河造成了極大的恐慌拥娄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熙暴,死亡現(xiàn)場離奇詭異闺属,居然都是意外死亡,警方通過查閱死者的電腦和手機周霉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門掂器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俱箱,你說我怎么就攤上這事国瓮。” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵乃摹,是天一觀的道長禁漓。 經常有香客問我,道長孵睬,這世上最難降的妖魔是什么播歼? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮掰读,結果婚禮上秘狞,老公的妹妹穿的比我還像新娘。我一直安慰自己蹈集,他們只是感情好烁试,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拢肆,像睡著了一般减响。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭怪,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天辩蛋,我揣著相機與錄音,去河邊找鬼移盆。 笑死悼院,一個胖子當著我的面吹牛,可吹牛的內容都是我干的咒循。 我是一名探鬼主播据途,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叙甸!你這毒婦竟也來了颖医?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤裆蒸,失蹤者是張志新(化名)和其女友劉穎熔萧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚祷,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佛致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辙谜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺榆。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖装哆,靈堂內的尸體忽然破棺而出罐脊,到底是詐尸還是另有隱情定嗓,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布萍桌,位于F島的核電站宵溅,受9級特大地震影響,放射性物質發(fā)生泄漏上炎。R本人自食惡果不足惜恃逻,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望反症。 院中可真熱鬧辛块,春花似錦畔派、人聲如沸铅碍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胞谈。三九已至,卻和暖如春憨愉,著一層夾襖步出監(jiān)牢的瞬間烦绳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工配紫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留径密,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓躺孝,卻偏偏與公主長得像享扔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子植袍,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法惧眠,類相關的語法,內部類的語法于个,繼承相關的語法氛魁,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • (一)Java部分 1厅篓、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,071評論 0 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • (大部分文字寫于2013年年底) 昨天羽氮,我是在夢想里勤勞的小蜜蜂 開個小花店应又,讀書、煮咖啡乏苦、聽音樂株扛、伺花弄草尤筐,每天...
    韓淑霞閱讀 1,929評論 10 11
  • 簡單的找一下規(guī)律1111111111001111111101011111110110111111011101111...
    Draper閱讀 286評論 0 0