Objective-C語言是物件導向的進階程式設計語言,因此,它具有物件導向編程所具有的一些特性,即:封裝性、繼承性和多態性。
今天介紹一下Objective-C中的多態性。
一、什麼是多態
多態:不同對象以自己的方式響應相同的訊息的能力叫做多態。
由於每個類都屬於該類的名字空間,這使得多態稱為可能。類定義中的名字和類定義外的名字並不會衝突。類的執行個體變數和類方法有如下特點:
方法名是對象介面的一部分。對象收到的訊息的名字就是調用的方法的名字。因為不同的對象可以有同名的方法,所以對象必須能理解訊息的含義。同樣的訊息發給不同的對象,導致的操作並不相同。
多態的主要好處就是簡化了編程介面。它容許在類和類之間重用一些習慣性的命名,而不用為每一個新加的函數命名一個新名字。這樣,編程介面就是一些抽象的行為的集合,從而和實現介面的類的區分開來。
Objective-C支援方法名的多態,但不支援參數和操作符的多態。
二、在Objective-C中如何?多態
在Objective-C中是通過一個叫做selector的選取器實現的。在Objective-C中,selector有兩個意思, 當用在給對象的源碼訊息時,用來指方法的名字。它也指那個在源碼編譯後代替方法名的唯一的標識符。 編譯後的選取器的類型是SEL有同樣名字的方法、也有同樣的選取器。你可以使用選取器來調用一個對象的方法。
選取器有以下特點:
* 所有同名的方法擁有同樣的選取器
* 所有的選取器都是不一樣的
(1) SEL和@selector
選取器的類型是 SEL。@selector指示符用來引用選取器,傳回型別是SEL。
例如:
SEL responseSEL;
responseSEL = @selector(loadDataForTableView:);
可以通過字串來得到選取器,例如:
responseSEL = NSSelectorFromString(@"loadDataForTableView:");
也可以通過反向轉換,得到方法名,例如:
NSString *methodName = NSStringFromSelector(responseSEL);
(2) 方法和選取器
選取器確定的是方法名,而不是方法實現。這是多態性和動態綁定的基礎,它使得向不同類對象發送相同的訊息成為現實;否則,發送 訊息和標準C中調用方法就沒有區別,也就不可能支援多態性和動態綁定。
另外,同一個類的同名類方法和執行個體方法擁有相同的選取器。
(3) 方法傳回值和@參數類型
訊息機制通過選取器找到方法的傳回值類型和參數類型,因此,動態綁定(例:向id定義的對象發送訊息)需要同名方法的實現擁有相 同傳回值類型和相同的參數類型;否則,運行時可能出現找不到對應方法的錯誤。
有一個例外,雖然同名灶方法和執行個體方法擁有相同的選取器,但是它們可以有不同的參數類型和傳回值類型。