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