IOS-OC-多态、isMemberOfClass和isKindOfClass

多态

一.多态与类的消息(方法)机制
指同一个消息(方法)根据发送的对象不同,而采用不同的行为方式
//因为其他类都是继承父类的 我们要添加方法也只是再父类那里添加方法,所以不会对其他类产生影响,因为父类的方法(消息)子类爱用不用,没什么影响

  1. 扩充性 我们添加方法不会影响其他类

//我们要调用同一个功能,而这个功能有很多对象来进行的,我们可以把他们的父类弄成某个类的成员变量,再在实现的时候,我们只需传入某个子类的指针对象,就可以调用子类相对应得方法,从而产生不同的反应.

  1. 接口性 把功能封装
    // 这样可以省略好多接口 比如:有很多动物继承animal 你难道也要像上面一样写这么多吗?用下面的方法 就只要写一条语句 这就是继承多态的好处
    申明的地方
  • (void) feedAnimal:(Animal *)animal
    实现的地方
    //这里就是 传入一个对象 你想谁来吃 就让谁来调用 然后实现他的方法
  • (void) feedAnimal:(Animal *)animal{
    [animal eat];
    }

//比如某个子类的反应(也就是方法里面的内容)要修改 只需改子类里面的东西就可以

  1. 简化性 每个类都有一个功能,一个有功能有问题,只需要找到这个类去修改

【多态要求满足三个条件】继承(init),重写,父类引用指向子类对象
//其实多态就是指,同一个接口不同的实现。
【注】OC的成员方法采用消息机制,因此都是虚函数。

// 见多态Demo

【虚方法】
1.父类的指针,可以指向子类的对象。
2.响应消息,不看指针,看对象。
【注】虚方法体现了不同事物被同一事件触发,有不同的响应。

殴打小动物
有两种小动物,Lavra BlackBug,一个人去打他们,他们做出不同的反应

4.谢霆锋的家长问孩子是谁的?
张柏芝:谢霆锋的
谢霆锋:陈冠希的
陈冠希:反正张柏芝的

  • (void)answer;
#import 
#import "Animal.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       // 不要看指针类型,因为响应消息的是对象,看消息发送给哪个对象
        // 这种不看指针,看对象的方法调用 叫做虚函数
        // 父类类型的指针可以指向子类对象
       Animal *ani =  [[Dog alloc] init];
       [ani jump];//Dog can jump 10m
        
    }
    return 0;
}
#import 

@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 
#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 
#import "Party.h"

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

@implementation Parent
- (void)askParty:(Party *)party
{
    [party answer];
}
@end
#import 

@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的区别

import

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
    // 判断是否这个类的实例
    if ([dog isMemberOfClass:[Animal class]]) {
        NSLog(@"dog 是Animal的实例");
    }
    
    if ([dog isMemberOfClass:[Dog class]]) {
        NSLog(@"dog 是Dog的实例");
    }
    
    if ([dog isMemberOfClass:[HaShiQi class]]) {
        NSLog(@"dog 是HaShiQi的实例");
    }

    
    // 判断对象是否是Animal这个类或者Animal这个类子类的实例
    if ([haShiQi isKindOfClass:[Animal class]]) {
        NSLog(@"haShiQi 是Animal的实例");
    }
    
    if ([haShiQi isKindOfClass:[Dog class]]) {
        NSLog(@"haShiQi 是Dog的实例");
    }
    
    if ([haShiQi isKindOfClass:[HaShiQi class]]) {
        NSLog(@"haShiQi 是HaShiQi的实例");
    }

    
}
return 0;

}

import

@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

#殴打动物多态案列

import

import "Lavra.h"

import "BlackBug.h"

import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 获取人这个对象
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

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

@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(@"吓死宝宝了");
    }
    @end

import "Animal.h"

@interface BlackBug : Animal

@end

import "BlackBug.h"

@implementation BlackBug

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


你可能感兴趣的:(IOS-OC-多态、isMemberOfClass和isKindOfClass)