iOS開發Objective-C基礎之──多型

子非あ魚發表於2013-09-25

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定義的物件傳送訊息)需要同名方法的實現擁有相     同返回值型別和相同的引數型別;否則,執行時可能出現找不到對應方法的錯誤。

         有一個例外,雖然同名灶方法和例項方法擁有相同的選取器,但是它們可以有不同的引數型別和返回值型別。

相關文章