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

2021-06-28 20:04:06 字數 1777 閱讀 7310

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...

多型 多型性和鴨子型別

目錄多型指的是同一種事物有多種形態,比如水有液態 固態和氣態。乙個抽象類有多個子類,因而多型的概念依賴於繼承。class animal def talk self pass class dog animal def talk self print 汪汪汪 class cat animal def t...

C 的靜態多型性和動態多型性(學習心得 20)

同乙個行為,具有多個不同表現形式或形態的能力。在物件導向程式設計正規化中,多型性往往表現為 乙個介面,多個功能 多型性可以是靜態的或動態的 在 c 中,每個型別都是多型的,因為包括使用者定義型別在內的所有型別都繼承自 object。同乙個事件發生在不同的物件上會產生不同的結果。超級小白友好,講解c ...