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