iOS多型性 動態繫結 與動態型別

2021-07-08 15:01:17 字數 1775 閱讀 2245

1. 多型性

多型性是個生物名詞,用來表示生物體在生命週期中的不同形態,用在程式語言中則表示相同的方法名,但是卻有不同的實現方式。或者說相同的名字,不同的類。我們來看乙個書上的示例:

#import //定義類 a

@inte***ce a : nsobject

-(void)print

@end

@implementation

-(void)print

@end

//定義類 b

@inte***ce b : nsobject

-(void)print

@end

@implementation

-(void)print

@end

int main(int argc, char *argv)

程式的最終輸出結果如下:

this is class a

this is class b

那麼類a和類b都包含了print方法,那麼系統怎麼知道什麼時候呼叫哪個方法呢?因為obj-c執行環境時支援型別檢查,知道類a是print訊息的第乙個接收者,類b是第二個接收者,那麼也就是同乙個方法名有不同的類實現,我們稱之為多型性。

2. 動態繫結和動態型別

id是公用的物件型別,它可以用來存放任何類的物件,那麼我們就再來看乙個如何運用id實現動態繫結的例子:

int main(int argc, char *argv)

在上面的**中我們可以看到temobj被宣告為id型別,因此它可以存放任何型別的物件,當temobj存放類a的物件a時,我們就可以通過temobj呼叫類a的全部方法,同樣,當temobj存放的類b的物件b時,我們也可以通過temobj來訪問類b的全部方法。

那麼,程式是如何知道我們要呼叫哪乙個類的print方法呢?很簡單,因為obj-c在執行時,環境會一直對「物件屬於哪個類」進行追蹤,基於動態型別和動態繫結的概念,系統會對物件的類作出正確的決定,系統會在執行的時候而不是編譯的時候決定呼叫哪乙個方法。

下面是object類確認物件型別的基礎api:

確認型別api表 方法

功能-(bool)iskindofclass:class-object

判斷物件是否是某一種類(包括其父類)的例項

-(bool)ismemberofclass:class-object

判斷物件是否是某一種類(不包括其父類)的例項

-(bool)respondstoselector:selector

判斷物件是否有實現某個方法

+(bool)instancesrepondtoselector:selector

判斷類的例項是否有實現某個方法

+(bool)issubclassofclass:class-object

判斷乙個類是否是某個類的子類

-(id)performselector:selector

讓物件呼叫指定的方法

-(id)performselector:selector withobject: object

讓物件呼叫指定的方法並且帶乙個引數

-(id)performselector:selector withobject: object1 withobject: object2

讓物件呼叫指定的方法並且帶兩個引數

上面的**中提到了常用的api方法,那麼在程式中我們可以靈活使用這些api來方便地實現各種動態程式語言特性,使得obj-c擁有了很多動態指令碼語言才有地特性

IOS開發中的多型性 動態型別和動態繫結

1.多型性 多型性是個生物名詞,用來表示生物體在生命週期中的不同形態,用在程式語言中則表示相同的方法名,但是卻有不同的實現方式。或者說相同的名字,不同的類。我們來看乙個書上的示例 import 定義類 a inte ce a nsobject void print end implementatio...

(C )C 多型性中的靜態繫結和動態繫結

靜態繫結和動態繫結是c 多型性的一種特性。物件在宣告是採用的型別,在編譯期確定 當前物件所指的型別,在執行期決定,物件的動態型別可以更改,但靜態型別無法更改。class b class c public b class d public b d pd new d pd的靜態型別是它宣告的型別d 動態...

多型 動態繫結和動態型別

多型 動態繫結和動態型別 bool iskindofclass class aclass 物件是不是aclass或者其子類的成員 bool ismemberofclass class aclass 物件是不是aclass成員 bool issubclassofclass class aclass 物...