1. 程式人生 > >OC多型特性詳解

OC多型特性詳解

多型在OC中,是面向物件的特性。引用Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。在OC中的本質就是:允許將子類型別的指標賦值給父類型別的指標,再呼叫父類的方法,這個方法既可以是子類重寫過的(會執行子類的方法),也可以是父類方法中傳入id型別,從而達到多型的特性。

多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。

OC中的多型:不同物件對同一訊息的不同響應。

這裡詳細說明兩點:

1:父類定義了一個方法後,子類可以重寫該方法,使用時,如果把子類的物件賦值給父類型別指標時,那麼呼叫方法時,會響應子類的方法。

2:多型的實現,引入了一個非常重要且常見的資料型別:id型別,這是一個萬能指標,它可以指向任意的型別,其本質是一種動態檢查型別,編譯時並不知道其具體指向了什麼型別,那麼定義的時候就隨意的使用,當然為了防止id指向的物件跟父類不對應或是物件的方法不存在,引入了幾種常見的檢查函式,例項中會詳解。

例項:

<textarea readonly="readonly" name="code" class="object-c"> 

父類Animal的.h檔案:

#import

<Cocoa/Cocoa.h>

@interface Animal : NSObject

@property (nonatomic,strong) NSString *name;

-(void)eat:(id)animal;

@end

    父類Animal的.m檔案:

#import "Animal.h"

@implementation Animal

-(void)eat:(id)animal{

//id 型別是萬能指標,可以指向任意的物件,實在使用中可以使用多種方法來檢測是否有這個物件或者有這個方法,

   [animal run];

    NSLog(@"%@在吃"

,_name);

}

@end

子類Dog的檔案

.h檔案:

#import "Animal.h"

@interface Dog : Animal

@end

.m檔案:

#import "Dog.h"

@implementation Dog

-(void)run{

   NSLog(@"狗在跑");

}

@end

子類Cat的檔案

.h檔案:

#import "Animal.h"

@interface Cat : Animal

@end

.m檔案:

#import "Cat.h"

@implementation Cat

-(void)run{

   NSLog(@"貓在跑");

}

@end

.main檔案:

#import <Foundation/Foundation.h>

#import "Animal.h"

#import "Dog.h"

#import "Cat.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

        Animal * ani = [[Animal alloc]init];

        Dog * dog = [Dog new];

        dog.name = @"汪汪";

        ani = dog;

//dog物件是否有run方法

        [dog respondsToSelector:@selector(run)];

//dog物件是否是Animal的子類

       [dog isKindOfClass:[Animal class]];

//dog是否是Animal

        [dog isMemberOfClass:[Animalclass]];

        NSLog(@"%d", [dog respondsToSelector:@selector(run)] );     

NSLog(@"%d",[dog isKindOfClass:[Animalclass]]);

NSLog(@"%d",[ani isMemberOfClass:[Animalclass]]);

        [ani eat:dog]; 

    }

    return 0;

}

</textarea>

相關推薦

OC特性

多型在OC中,是面向物件的特性。引用Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。在OC中的本質就是:允許將子類型別的指標賦值給父類型

JAVA的特性

 * 多型:    父類的 引用變數 指向了子類的物件              或者  *         介面的 引用變數 指向了介面實現類物件  * 多型前提:必須存在 繼承或者 實現關係  * 多型要注意的細節:  *     1.多型情況下,子父類 存在 同名的成員

c++:(理解)

目錄 3抽象類 6物件模型 2:單繼承 3:多繼承 1多型概念: 通俗來講,就是多種形態,同一事物在不同場景下表現出的不同狀態。 2多型實現: c++的多型是在繼承的基礎上,增加了虛擬函式,並且讓派生

基礎篇——面向物件及

寫程式碼的四點:     1.明確需求。要做什麼?     2.分析思路。要怎麼做?(1,2,3……)     3.確定步驟。每一個思路要用到哪些語句、方法和物件。     4.程式碼實現。用具體的語言程式碼將思路實現出來。學習新技術的四點:     1.該技術是什麼?   

mybatis懶載入特性,以及對映

注意講解都在程式碼中 準備資料庫,測試資料,各位自己新增,因為是多對多,所以使用中間表: 用到的實體: 學生類: public class Student { private Integer sid; private String n

Java 線程(三)------線程的同步

alt 來看 監聽 介紹 創建進程 java 多線程 system ima 關鍵字 Java 多線程詳解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多線程詳解(二)------如何創建進

Linux特性

linux特性詳解 history 命令替換 命令別名 文件名統配 bash及其特性:shell: 外殼GUI:Gnome, KDE, XfceCLI: sh, csh, ksh, bash, tcsh, zsh Linux允許同一個用戶登錄多次root, student程序:進程 進程:

php multicast播實現

clas -s ria socket php文件 pan php set 廣播 什麽是多播? 網絡中存在3中傳播形式,單播,廣播,多播。 1. 單播 : 就是1->1 2. 廣播 : 1->多(廣播域內) 3. 多播 : 1->組(一組ip) 1

ASP.NET Core Web服務器 Kestrel和Http.sys 特性

訪問 一次循環 共享 ref iframe 功能 thead 都在 否則 ASP.NET Core Web服務器 Kestrel和Http.sys 特性詳解 1.1. 名詞解釋 1.2. Kestrel基本工作原理 1.2.1. Kestrel的基本架

Jmockit之mock特性

至少 順序 extra xpl replay int 階段 es2017 matcher 本文是Jmockit學習過程中,根據官網所列的工具特性進行解讀。 1、調用次數約束(Invocation count constraints) 可以通過調用計數約束來指定預期和/或允許

表單提交時編碼類enctype

表單提交 這不 algo inter 轉義 除了 如果 ctype target 很早以前,當還沒有前端這個概念的時候,我在寫表單提交完全不去理會表單數據的編碼,在action屬性裏寫好目標URL,剩下的啊交給瀏覽器吧~但是現在,更多時候我們都采用Ajax方式提交數據,這種

【轉】C#各個版本中的新增特性

members 托管 分隔符 main 數據 logs ttr dot 提高 轉自:http://www.cnblogs.com/knowledgesea/p/6694979.html 序言 自從2000年初期發布以來,c#編程語言不斷的得到改進,使我們能夠更加清晰的編

Java語言特性

執行過程 uri tro 派生 活動 多線程 函數 嚴格 connect Java語言是一個支持網絡計算的面向對象程序設計語言。Java語言吸收了Smalltalk語言和C++語言的優點,並增加了其它特性, 如支持並發程序設計、網絡通信、和多媒體數據控制等。

java類轉換(自動轉換和強制轉換)

代碼 oid 高精 log 相加 println 類型轉換詳解 範圍 void 自動轉換 class Hello { public static void main(String[] args) { //自動轉換 int a = 5; byte b = 6

linux初級學習筆記五:bash特性!(視頻序號:03_2,3)

可執行文件 文件名通配符 內核 引用 完成 -c family man 文件 本節學習的命令:history,alias,ualias,\CMD 本節學習的技能:        bash的特性      光標跳轉      查看命令歷史      命令歷史的使用技巧  

第三課 第二講03_02_bash特性.avi

文件名 忽略 history 查詢 查看命令 出現 命令別名 包含 定義 第三課 第二講03_02_bash特性詳解.avi1.文件排序命令sort(默認Ascii碼升序排序)-n數值大小排序-r逆序-t字段分割符-k以哪個字段為key進行排序-u排序後重復行行只顯示一次-

python進程

arm 新的 cts 適合 pre %s har star 相互 1、由於python多線程適合於多IO操作,但不適合於cpu計算型工作,這時候可以通過多進程實現。python多進程簡單實用 # 多進程,可以cpu保持一致,python多線程適合多io.對於高cpu的可以

JDK8 特性

handle 實例 zone localdate 當前 ins 值轉換 默認值 end Base64 對Base64編碼的支持已經被加入到Java 8官方庫中,這樣不需要使用第三方庫就可以進行Base64編碼,例子代碼如下: 1 package com.cn.yunli

mongodb replica set 配置高性能服務器

自定義 rep error: plain sync ntc rtb fin repl mongodb的多服務器配置,以前寫過一篇文章,是master-slave模式的,請參考:詳解mongodb 主從配置。master-slave模式,不能自動實現故障轉移和恢復。所以推薦大

Mysql 三大特性

追蹤 方式 還需要 性能 arc 直接插入 解決 auto 依次 Mysql Innodb後臺線程 工作方式 首先Mysql進程模型是單進程多線程的。所以我們通過ps查找mysqld進程是只有一個。 體系架構 InnoDB存儲引擎的架構如下圖所以,是由多個內存塊組成的內