• 多态(二十八)


    多态

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

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

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

    }

  • 相关阅读:
    【转】如何正确复制CSDN文章到自己的博客
    【转】Win10双网卡优先顺序设置
    Android studio中生成javadoc
    【转】HTML5 布局固定宽度
    字节跳动静态资源公共库
    【转】Android studio中生成javadoc
    怎么选择 Go 文件读取方案
    prometheus存储
    gogorm的预加载 preload或related方法使用场景(外键)
    go的gin跨域中间件
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5118651.html
Copyright © 2020-2023  润新知