OC语言day03-11多态

pragma mark 多态

pragma mark 概念

/**
 #warning 相同的方法 可以 抽取 父类(但是不要随便抽取父类) 需要符合条件才可以抽取父类即 : xxx 是 xxx (猫是动物)(如果是 说明可以抽取父类)
 什么是多态:
 多态就是 某一类 事物 的多种形态
 猫 : 猫 -> 动物
 狗 : 狗 -> 动物
 
 男人 : 男人 -> 人 - > 高级动物
 女人 : 女人 -> 人 - > 高级动物
 
 程序中的多态 : 父类 指针 指向 子类对象
 */

/*
 什么是多态:
 事物的多重表现形态
 
 在程序中如何表现:
 父类指针 指向 子类对象
 
 优点 :
 提高了代码的扩展性
 
 注意点:
 如果 父类指针 指向 子类对象, 如果需要调用子类特有的方法, 必须先强制类型 转换
 Animal *a1 = [Dog new];  // 父类
 Dog *d1 = (Dog *)a1;     // 强制类型 转换
 [d1 kanJia];             // 子类 对象方法
 */

pragma mark 代码

#import <Foundation/Foundation.h>
#pragma mark 类
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Pig.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
    /*
    Dog *d = [Dog new];
    [d eat];
    
    Cat *c = [Cat new];
    [c eat];
     */
    
#warning 多态
    /*
    // 多态 : 事物的 多种表现形态
    // 动态类型 : 在编译的时候 编译器只会检查 当前类型对应的类中 有没有需要调用的方法 (在Animal中 检查有没有eat方法)
    //           在运行时, 系统会自动判断 a1的真实类型 (下面的真实类型是 Dog)
    Animal *a1 = [Dog new];
    [a1 eat];
#warning 注意点: 在多态中, 如果想调用子类特有的方法 必须 强制类型转换为子类 才能调用
//    [a1 kanJia];    // 编译是 去看Animal 看有没有 kanJia 这个方法 没有救报错
    Dog *d1 = (Dog *)a1;
    [d1 kanJia];
     
     */
    
#warning 使用场景
    Dog *d = [Dog new];
    Cat *c = [Cat new];
    Pig *p = [Pig new];
    
    [Person foot:d];
    [Person foot:c];
    [Person foot:p];
    
#warning 总结
    /*
     什么是多态:
     事物的多重表现形态
     
     在程序中如何表现:
     父类指针 指向 子类对象
     
     优点 :
     提高了代码的扩展性
     
     注意点:
     如果 父类指针 指向 子类对象, 如果需要调用子类特有的方法, 必须先强制类型 转换
     Animal *a1 = [Dog new];  // 父类
     Dog *d1 = (Dog *)a1;     // 强制类型 转换
     [d1 kanJia];             // 子类 对象方法
     */
    
    return 0;
}

Person.h // 人类 (基本的父类)
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Pig.h" 

@interface Person : NSObject

#warning 没有访问到 成员变量 可以使用类方法
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
// 长颈鹿
// 白虎
// 孔雀
// 猴子
 */

+ (void)foot:(Animal *)animal;
@end
Person.m
#import "Person.h"

@implementation Person

/*
+ (void)food:(Dog *)dog
{
    [dog eat];
}

+ (void)foodCat:(Cat *)cat
{
    [cat eat];
}
*/

+ (void)foot:(Animal *)a
{
    [a eat];
}


@end
Animal.h // 动物类 (父类)
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Dog : Animal
- (void)eat;
- (void)kanJia;
@end
Animal.m

#import "Animal.h"

@implementation Animal

- (void)eat
{
    NSLog(@"吃东西");
}

@end


Dog.h //狗类 ((animal)子类)
###import <Foundation/Foundation.h>
#import "Animal.h"
@interface Dog : Animal
- (void)eat;
- (void)kanJia;
@end
Dog.m
#warning 重写父类方法
- (void)eat
{
    NSLog(@"啃骨头");
}

-(void)kanJia
{
    NSLog(@"看家");
}
@end

Cat.h // 猫类 (animal 子类)
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Cat : Animal

- (void)eat;
@end
Cat.m

#import "Cat.h"

@implementation Cat

#warning 重写父类方法
- (void)eat
{
    NSLog(@"吃鱼");
}
@end


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容