Object-c多態

1 id類型

id類型是一種通用的對象類型,id可以用來存儲什麼類型的對象。類似Java的Object。

2 動態綁定

動態綁定也叫多態,是在程序運行期間,根據對象的實際類型進行相應的調用。

#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
int main(){
         @autoreleasepool{
                   id animal;
                   Dog *dog = [[Dog alloc] init];
                   Cat *cat = [[Cat alloc] init];
                   animal = dog;
                   [animal bark];  //[dog bark];
                   id = cat;
                   [animal bark];  //[cat bark];
         }
}

上面有兩個類型,Dog和Cat,這兩個類型都有一個bark方法,狗和貓的叫聲不同,方法實現不同。

id類型可以指向任何對象,所以id可以表示Dog和Cat,id類型會跟蹤對象的實際類型,運行的時候,id會先判斷對象的實際類型,然後再進行調用。而不是編譯期間。

所以當id指向dog時,調用的是dog的bark方法,指向cat時,調用cat的方法。

 

3編譯時和運行時檢查

因爲id類型是在運行時進行判斷是什麼對象,所以很多錯誤會在運行時發生。如下:

animal = dog;
[animal dance];

這裏的dog並沒有dance方法,但是id類型運行時纔會檢查,所以編譯器不會檢查,這裏會產生找不到方法錯誤,unrecognized selector to instance

 

4 類的檢查


class: 要獲取class對象可以使用class方法。

[Dog class];
[dog class]  //dog爲類Dog的對象。
if( [obj1 class]==[obj2 class] )   //判斷是否是相同的類實例
[ dog isMemberOfClass: [Dog class] ];   //判斷dog是否是Dog的成員

selector: @selector( alloc );

SEL sel = @selector ( setNum: );
SEL sel = @selector ( setName: andAge: );
[Dog instancesRespondToSelector: @selector ( setName: andAge: )];  //包含繼承的方法

5 異常處理

異常處理跟Java很類似,使用@try{}@catch( NSException *exception ){}塊。

如果try塊內的代碼拋出異常,執行不會終止,而是立即跳到@catch塊中,在那裏繼續執行。

在@catch塊中可以處理異常。

@finally和@throw方法的使用跟Java一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章