多态
面向对象的三大特征之一。
多态的核心,是“父类指针指向子类对象”。体现多态的特点,是把父类指针作为参数,或者返回值的时候比较明显。
详细来说,就是我把父类指针作为参数,当传参数的时候,可以把这个父类下的任意子类当作参数传进来。或者我把父类指针当作返回值类型的时候,可以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; } |