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