//
// main.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Animal.h"
#import "Dog.h"
//#import "Cat.h"
int main(int argc, const char * argv[]) {
/*
1. 多态就是某一类事物的多重形态
例如:猫,既是猫 同时 又是动物,这里猫有两种形态
男人,既是男人 又是人 同时 又是高级动物,这里男人有三种形态
2. 多态在代码中的体现:
> 用父类的指针 指向了子类对象,这就是对象
例如:动物 *a =[猫 new]; // 这里动物类是猫类的父类
人 *r =[男人 new]; // 这里人类是男人类的父类
3. 使用多态的前提
> 必须要有继承,没有继承就没有多态
4. 动态绑定
> 即运行方法时会动态检查对象的真实类型
例如:
Animal *a = [Cat new];
[a eat]; // 这里当通过a指针调用eat方法时候,系统会自动检测出对象的真实类型为Cat而不是Animal
5. 多态的好处
> 多态的存在提高了程序的可扩展性
6. 多态的局限性
> 父类类型的指针不能调用子类对象的特有方法,如果要调用,必须强制类型转换为子类类型
注意:但是不要把父类类型强制转换为子类类型,因为有动态绑定,系统会自动检测真类型
*/
Person *p = [Person new];
Dog *d = [Dog new];
// Cat *c = [Cat new];
// Animal *a = [Animal new];
[p feedDog:d];
[p feedAnimal:d]; // 这里传入实参为狗对象,打印结果为:狗要吃东西,
return 0;
}
//
// Person.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
//#import "Cat.h"
@interface Person : NSObject
// 喂狗
- (void)feedDog:(Dog *)dog;
// 喂猫
//- (void)feedCat:(Cat *)cat;
// 但是这里如果有一千种动物,那么就要写一千个喂养的方法,可是这些方法除了参数不同
// 其他大致相同,那么我们可以把参数设置成狗和猫的父类Animal类,使用父类对象传入
// 根据多态的 动态绑定特性,在调用方法运行时候,会使用实际对象,也就是每中动物对象调用方法
- (void)feedAnimal:(Animal *)animal;
@end
//
// Person.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Person.h"
@implementation Person
- (void)feedDog:(Dog *)dog
{
[dog eat];
}
// 喂猫
//- (void)feedCat:(Cat *)cat
//{
// [cat eat];
//}
- (void)feedAnimal:(Animal *)animal
{
// 运行时候动态绑定(动态的判断animal的真实类型)
[animal eat];
}
@end
//
// Animal.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
}
- (void)eat;
@end
//
// Animal.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Animal.h"
@implementation Animal
- (void)eat
{
NSLog(@"动物都会吃东西!");
}
@end
//
// Dog.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Animal.h"
@interface Dog : Animal
- (void)eat;
- (void)jiao;
@end
//
// Dog.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Dog.h"
@implementation Dog
- (void)eat
{
NSLog(@"狗要吃东西");
}
- (void)jiao
{
NSLog(@"一只会叫的狗!");
}
@end
// main.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Animal.h"
#import "Dog.h"
//#import "Cat.h"
int main(int argc, const char * argv[]) {
/*
1. 多态就是某一类事物的多重形态
例如:猫,既是猫 同时 又是动物,这里猫有两种形态
男人,既是男人 又是人 同时 又是高级动物,这里男人有三种形态
2. 多态在代码中的体现:
> 用父类的指针 指向了子类对象,这就是对象
例如:动物 *a =[猫 new]; // 这里动物类是猫类的父类
人 *r =[男人 new]; // 这里人类是男人类的父类
3. 使用多态的前提
> 必须要有继承,没有继承就没有多态
4. 动态绑定
> 即运行方法时会动态检查对象的真实类型
例如:
Animal *a = [Cat new];
[a eat]; // 这里当通过a指针调用eat方法时候,系统会自动检测出对象的真实类型为Cat而不是Animal
5. 多态的好处
> 多态的存在提高了程序的可扩展性
6. 多态的局限性
> 父类类型的指针不能调用子类对象的特有方法,如果要调用,必须强制类型转换为子类类型
注意:但是不要把父类类型强制转换为子类类型,因为有动态绑定,系统会自动检测真类型
*/
Person *p = [Person new];
Dog *d = [Dog new];
// Cat *c = [Cat new];
// Animal *a = [Animal new];
[p feedDog:d];
[p feedAnimal:d]; // 这里传入实参为狗对象,打印结果为:狗要吃东西,
return 0;
}
//
// Person.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
//#import "Cat.h"
@interface Person : NSObject
// 喂狗
- (void)feedDog:(Dog *)dog;
// 喂猫
//- (void)feedCat:(Cat *)cat;
// 但是这里如果有一千种动物,那么就要写一千个喂养的方法,可是这些方法除了参数不同
// 其他大致相同,那么我们可以把参数设置成狗和猫的父类Animal类,使用父类对象传入
// 根据多态的 动态绑定特性,在调用方法运行时候,会使用实际对象,也就是每中动物对象调用方法
- (void)feedAnimal:(Animal *)animal;
@end
//
// Person.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Person.h"
@implementation Person
- (void)feedDog:(Dog *)dog
{
[dog eat];
}
// 喂猫
//- (void)feedCat:(Cat *)cat
//{
// [cat eat];
//}
- (void)feedAnimal:(Animal *)animal
{
// 运行时候动态绑定(动态的判断animal的真实类型)
[animal eat];
}
@end
//
// Animal.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
}
- (void)eat;
@end
//
// Animal.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Animal.h"
@implementation Animal
- (void)eat
{
NSLog(@"动物都会吃东西!");
}
@end
//
// Dog.h
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Animal.h"
@interface Dog : Animal
- (void)eat;
- (void)jiao;
@end
//
// Dog.m
// 多态
//
// Created by admin on 15/7/27.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Dog.h"
@implementation Dog
- (void)eat
{
NSLog(@"狗要吃东西");
}
- (void)jiao
{
NSLog(@"一只会叫的狗!");
}
@end