IOS-OC-多態(tài)隐锭、isMemberOfClass和isKindOfClass

多態(tài)

一.多態(tài)與類的消息(方法)機(jī)制
指同一個(gè)消息(方法)根據(jù)發(fā)送的對象不同携悯,而采用不同的行為方式
//因?yàn)槠渌惗际抢^承父類的 我們要添加方法也只是再父類那里添加方法获询,所以不會(huì)對其他類產(chǎn)生影響,因?yàn)楦割惖姆椒ǎㄏⅲ┳宇悙塾貌挥媚穑瑳]什么影響

  1. 擴(kuò)充性 我們添加方法不會(huì)影響其他類

//我們要調(diào)用同一個(gè)功能冯凹,而這個(gè)功能有很多對象來進(jìn)行的,我們可以把他們的父類弄成某個(gè)類的成員變量炒嘲,再在實(shí)現(xiàn)的時(shí)候宇姚,我們只需傳入某個(gè)子類的指針對象,就可以調(diào)用子類相對應(yīng)得方法夫凸,從而產(chǎn)生不同的反應(yīng).

  1. 接口性 把功能封裝
    // 這樣可以省略好多接口 比如:有很多動(dòng)物繼承animal 你難道也要像上面一樣寫這么多嗎浑劳?用下面的方法 就只要寫一條語句 這就是繼承多態(tài)的好處
    申明的地方
  • (void) feedAnimal:(Animal *)animal
    實(shí)現(xiàn)的地方
    //這里就是 傳入一個(gè)對象 你想誰來吃 就讓誰來調(diào)用 然后實(shí)現(xiàn)他的方法
  • (void) feedAnimal:(Animal *)animal{
    [animal eat];
    }

//比如某個(gè)子類的反應(yīng)(也就是方法里面的內(nèi)容)要修改 只需改子類里面的東西就可以

  1. 簡化性 每個(gè)類都有一個(gè)功能,一個(gè)有功能有問題夭拌,只需要找到這個(gè)類去修改

【多態(tài)要求滿足三個(gè)條件】繼承(init)魔熏,重寫,父類引用指向子類對象
//其實(shí)多態(tài)就是指鸽扁,同一個(gè)接口不同的實(shí)現(xiàn)蒜绽。
【注】OC的成員方法采用消息機(jī)制,因此都是虛函數(shù)桶现。

// 見多態(tài)Demo

【虛方法】
1.父類的指針躲雅,可以指向子類的對象。
2.響應(yīng)消息骡和,不看指針相赁,看對象。
【注】虛方法體現(xiàn)了不同事物被同一事件觸發(fā)慰于,有不同的響應(yīng)钮科。

毆打小動(dòng)物
有兩種小動(dòng)物,Lavra BlackBug婆赠,一個(gè)人去打他們跺嗽,他們做出不同的反應(yīng)

4.謝霆鋒的家長問孩子是誰的?
張柏芝:謝霆鋒的
謝霆鋒:陳冠希的
陳冠希:反正張柏芝的

  • (void)answer;
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       // 不要看指針類型,因?yàn)轫憫?yīng)消息的是對象页藻,看消息發(fā)送給哪個(gè)對象
        // 這種不看指針,看對象的方法調(diào)用 叫做虛函數(shù)
        // 父類類型的指針可以指向子類對象
       Animal *ani =  [[Dog alloc] init];
       [ani jump];//Dog can jump 10m
        
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Animal : NSObject
- (void)jump;
@end
#import "Animal.h"

@implementation Animal
- (void)jump
{
    NSLog(@"Animal can jump 3m");
}
@end
#import "Animal.h"

@interface Dog : Animal

@end
#import "Dog.h"

@implementation Dog
- (void)jump
{
    NSLog(@"Dog can jump 10m");
}
@end

家長問

#import <Foundation/Foundation.h>
#import "Parent.h"
#import "ZhangBoZhi.h"
#import "XieTingFeng.h"
#import "ChenGuanXi.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 1. 獲取家長
        Parent *xieXian = [[Parent alloc] init];
        
        // 2. 獲取張柏芝
        ZhangBoZhi *zbz = [[ZhangBoZhi alloc] init];
        
        // 3. 獲取謝霆鋒
        XieTingFeng *xtf = [[XieTingFeng alloc] init];
        
        // 4. 獲取陳冠希
        ChenGuanXi *cgx = [[ChenGuanXi alloc] init];
        
        // 5.家長問
        [xieXian askParty:zbz];
        [xieXian askParty:xtf];
        [xieXian askParty:cgx];
    }
    return 0;
}
#import <Foundation/Foundation.h>
#import "Party.h"

@interface Parent : NSObject
- (void)askParty:(Party *)party;
@end
#import "Parent.h"

@implementation Parent
- (void)askParty:(Party *)party
{
    [party answer];
}
@end
#import <Foundation/Foundation.h>

@interface Party : NSObject
- (void)answer;
@end
#import "Party.h"

@implementation Party
- (void)answer
{
    
}
@end
#import "Party.h"

@interface ZhangBoZhi : Party

@end

import "ZhangBoZhi.h"

@implementation ZhangBoZhi

  • (void)answer
    {
    NSLog(@"謝霆鋒的");
    }
    @end

import "Party.h"

@interface XieTingFeng : Party

@end

import "XieTingFeng.h"

@implementation XieTingFeng

  • (void)answer
    {
    NSLog(@"陳冠希的");
    }
    @end

import "Party.h"

@interface ChenGuanXi : Party

@end

import "ChenGuanXi.h"

@implementation ChenGuanXi

  • (void)answer
    {
    NSLog(@"反正張柏芝的");
    }
    @end
#isMemberOfClass和isKindOfClass的區(qū)別

import <Foundation/Foundation.h>

import "Animal.h"

import "Dog.h"

import "HaShiQi.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *animal = [[Animal alloc] init];
Dog *dog = [[Dog alloc] init];
HaShiQi *haShiQi = [[HaShiQi alloc] init];

    //isMemberOfClass
    // 判斷是否這個(gè)類的實(shí)例
    if ([dog isMemberOfClass:[Animal class]]) {
        NSLog(@"dog 是Animal的實(shí)例");
    }
    
    if ([dog isMemberOfClass:[Dog class]]) {
        NSLog(@"dog 是Dog的實(shí)例");
    }
    
    if ([dog isMemberOfClass:[HaShiQi class]]) {
        NSLog(@"dog 是HaShiQi的實(shí)例");
    }

    
    // 判斷對象是否是Animal這個(gè)類或者Animal這個(gè)類子類的實(shí)例
    if ([haShiQi isKindOfClass:[Animal class]]) {
        NSLog(@"haShiQi 是Animal的實(shí)例");
    }
    
    if ([haShiQi isKindOfClass:[Dog class]]) {
        NSLog(@"haShiQi 是Dog的實(shí)例");
    }
    
    if ([haShiQi isKindOfClass:[HaShiQi class]]) {
        NSLog(@"haShiQi 是HaShiQi的實(shí)例");
    }

    
}
return 0;

}

import <Foundation/Foundation.h>

@interface Animal : NSObject

@end

import "Animal.h"

@implementation Animal

@end

import "Animal.h"

@interface Dog : Animal

@end

import "Dog.h"

@implementation Dog

@end

import "Dog.h"

@interface HaShiQi : Dog

@end

import "HaShiQi.h"

@implementation HaShiQi

@end

#毆打動(dòng)物多態(tài)案列

import <Foundation/Foundation.h>

import "Lavra.h"

import "BlackBug.h"

import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 獲取人這個(gè)對象
Person *person = [[Person alloc] init];

    // 2. Lavra對象
    Lavra *lavra = [[Lavra alloc] init];
    
    // 3. BlackBug 對象
    BlackBug *blackBug = [[BlackBug alloc] init];
    
    // 4. 人去打蟲子

// [person hitAnimalWithLavra:lavra];
// [person hitAnimalWithBlackBug:blackBug];
[person hitAnimal:blackBug];

}
return 0;

}

import <Foundation/Foundation.h>

import "Lavra.h"

import "BlackBug.h"

import "Animal.h"

@interface Person : NSObject

  • (void)hitAnimal:(Animal *)ani;

//- (void)hitAnimalWithLavra:(Lavra *)lavra;
//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug;
@end

import "Person.h"

@implementation Person

  • (void)hitAnimal:(Animal *)ani
    {
    [ani react];
    }

//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug
//{
// [blackBug react];
//}
//
//- (void)hitAnimalWithLavra:(Lavra *)lavra
//{
// [lavra react];
//}
@end

import <Foundation/Foundation.h>

@interface Animal : NSObject

  • (void)react;
    @end

import "Animal.h"

@implementation Animal

  • (void)react
    {

}
@end

import "Animal.h"

@interface Lavra : Animal

@end

import "Lavra.h"

@implementation Lavra

  • (void)react{
    NSLog(@"嚇?biāo)缹殞毩?);
    }
    @end

import "Animal.h"

@interface BlackBug : Animal

@end

import "BlackBug.h"

@implementation BlackBug

  • (void)react
    {
    NSLog(@"把人揍了一頓");
    }
    @end


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末植兰,一起剝皮案震驚了整個(gè)濱河市份帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楣导,老刑警劉巖废境,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡噩凹,警方通過查閱死者的電腦和手機(jī)巴元,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驮宴,“玉大人逮刨,你說我怎么就攤上這事《略螅” “怎么了修己?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迎罗。 經(jīng)常有香客問我睬愤,道長,這世上最難降的妖魔是什么纹安? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任尤辱,我火速辦了婚禮,結(jié)果婚禮上厢岂,老公的妹妹穿的比我還像新娘光督。我一直安慰自己,他們只是感情好咪笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布可帽。 她就那樣靜靜地躺著,像睡著了一般窗怒。 火紅的嫁衣襯著肌膚如雪映跟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天扬虚,我揣著相機(jī)與錄音努隙,去河邊找鬼。 笑死辜昵,一個(gè)胖子當(dāng)著我的面吹牛荸镊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堪置,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躬存,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舀锨?” 一聲冷哼從身側(cè)響起岭洲,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坎匿,沒想到半個(gè)月后盾剩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷激,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年告私,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屎暇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驻粟,死狀恐怖根悼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情格嗅,我是刑警寧澤番挺,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站屯掖,受9級特大地震影響玄柏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴铜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一粪摘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绍坝,春花似錦徘意、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至把介,卻和暖如春勤讽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拗踢。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工脚牍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巢墅。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓诸狭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親君纫。 傳聞我的和親對象是個(gè)殘疾皇子驯遇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 繼承 【繼承】【注】這里說的繼承,指集合的包含關(guān)系蓄髓,即父類和子類的關(guān)系 一.認(rèn)識(shí)繼承(一)從生活邏輯的角度父類 ...
    草根小強(qiáng)閱讀 1,327評論 0 0
  • 本節(jié)學(xué)習(xí)內(nèi)容: 1.繼承的概念 2.子類重寫父類的方法 3.父類指針指向子類對象 4.多態(tài)實(shí)現(xiàn) 【main.m】 ...
    奔跑的小小魚閱讀 515評論 0 0
  • Oc基礎(chǔ) 1妹懒、#import的用途 1>#import與#include一樣,拷貝文件的內(nèi)容 2>可以自動(dòng)防止文件...
  • 學(xué)習(xí)目標(biāo) 1.【理解】對象在內(nèi)存中的存儲(chǔ) 2.【理解】nil和NULL 3.【了解】#pragma mark分組導(dǎo)...
    Hm丶閱讀 477評論 0 3
  • 畫畫天賦重要嗎?當(dāng)然重要了好乐! 看到有天賦的人第一次臨摹就畫的很好匾竿,對于沒天賦的我畫的真的很心塞?……
    與見yj閱讀 265評論 2 1