iOS开发Objective-C基础之──多态
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定義的對象發送消息)需要同名方法的實現擁有相 ? ? 同返回值類型和相同的參數類型;否則,運行時可能出現找不到對應方法的錯誤。
?? ? ? ? 有一個例外,雖然同名灶方法和實例方法擁有相同的選取器,但是它們可以有不同的參數類型和返回值類型。
轉載于:https://www.cnblogs.com/lm3515/p/3338409.html
總結
以上是生活随笔為你收集整理的iOS开发Objective-C基础之──多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 登录oneNote失败解决
- 下一篇: Verilog MIPS32 CPU(八