Objective-C語言是物件導向的高階程式語言,因此,它具有物件導向程式設計所具有的一些特性,即:封裝性、繼承性和多型性。
今天介紹一下Objective-C中的多型性。
一、什麼是多型
多型:不同物件以自己的方式響應相同的訊息的能力叫做多型。
由於每個類都屬於該類的名字空間,這使得多型稱為可能。類定義中的名字和類定義外的名字並不會衝突。類的例項變數和類方法有如下特點:
-
和C語言中結構體中的資料成員一樣,類的例項變數也位於該類獨有的名字空間。
-
類方法也同樣位於該類獨有的名字空間。與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定義的物件傳送訊息)需要同名方法的實現擁有相 同返回值型別和相同的引數型別;否則,執行時可能出現找不到對應方法的錯誤。
有一個例外,雖然同名灶方法和例項方法擁有相同的選取器,但是它們可以有不同的引數型別和返回值型別。