多态(二十八)

 

多态

面向对象的三大特征之一。

多态的核心,是“父类指针指向子类对象”。体现多态的特点,是把父类指针作为参数,或者返回值的时候比较明显。

详细来说,就是我把父类指针作为参数,当传参数的时候,可以把这个父类下的任意子类当作参数传进来。或者我把父类指针当作返回值类型的时候,可以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;

}

posted @ 2016-01-10 16:13  恒远也  阅读(216)  评论(1编辑  收藏  举报