多态
面向对象的三大特征之一。
多态的核心,是“父类指针指向子类对象”。体现多态的特点,是把父类指针作为参数,或者返回值的时候比较明显。
详细来说,就是我把父类指针作为参数,当传参数的时候,可以把这个父类下的任意子类当作参数传进来。或者我把父类指针当作返回值类型的时候,可以return这个父类下的任意子类。
也就是创建子类对象,然后将这个对象当作参数传出去或者返回值return。
就是这样实现多态。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject
- (void)say;
@end |
Person.m
#import "Person.h"
@implementation Person - (void)say{ NSLog(@"我是一个人?、。"); } @end |
Student.h
#import "Person.h"
@interface Student : Person
- (void)study; @end |
Student.m
#import "Student.h"
@implementation Student - (void)study{ NSLog(@"我再学习,口可口可..."); } @end |
Teacher.h
#import "Person.h"
@interface Teacher : Person
@end |
Teacher.m
#import "Teacher.h"
@implementation Teacher
@end |
Play.h
#import <Foundation/Foundation.h> @class Person; @interface Play : NSObject
- (void)play:(Person *)aPerson;
@end |
Play.m
#import "Play.h" #import "Person.h" #import "Student.h" #import "Teacher.h" @implementation Play - (void)play:(Person *)aPerson{
//获取类型 [aPerson className]; //要使用子类特性 //要强制转换回来(转换类型) Teacher *t = aPerson;
NSLog(@"%@",[aPerson className]); } @end |
main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" #import "Teacher.h" #import "Play.h" int main(int argc, const char * argv[]) { @autoreleasepool {
//多态 //父类指针指向子类对象 //一般用在参数 和 返回值
//学生对象被父类指针指向 Person *p1 = [[Student alloc]init];
// [p1 say];
Student *s1 = [[Student alloc]init];
Teacher *t1 = [[Teacher alloc]init];
Play *play = [[Play alloc]init];
[play play:t1]; // [p1 study];
} return 0; } |