• OC——多态


    书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看OC的多态。

    多态:顾名思义就是好多种状态,以前学C#时候印象最深刻的例子是好多个类共同实现同一个接口,然后把这些类的对象都装到一个集合中,然后循环遍历调用接口方法,得到的结果是不同的。我们对多态应该都有大概的印象,我们现在就来看看使用OC语言怎么实现多态。

    实现多态有两种方式一种是继承父类实现,一种是实现协议实现(OC中的协议就是平时我们所说的接口);我们一个一个的看,都大同小异,我们先来看继承父类的

    一、继承的实现

    基于上文中的父类和子类的代码不变,我只在调用时改了一点点,就可以体现出多态。

    调用方法:

     1 //
     2 //  main.m
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Peason.h"
    11 #import "Student.h"
    12 
    13 int main(int argc, const char * argv[]) {
    14     @autoreleasepool {
    15         Peason* p=[[Student alloc]initWithName:@"Tom" Age:14];
    16         [p Say];
    17         Student* s=[[Student alloc]initWithName:@"Jack" Age:12];
    18         [s Say];
    19     }
    20     return 0;
    21 }

    输出结果:

    2015-07-05 15:45:44.705 01-继承和多态[1320:47982] My name is Tom. I am student.

    2015-07-05 15:45:44.706 01-继承和多态[1320:47982] My name is Jack. I am student.

    注意第17行“=”号右边我把Student的对象赋给了Peason对象p ,p调用Say方法,Say方法输出的是Student重写后的结果而不是Peason的Say方法的结果

    上面表示的是最简单的一种多态实现,下面我们来说第二种多态实现。

    二、实现协议实现

    协议:

     1 //
     2 //  BehaviorProtocol.h
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 @protocol BehaviorProtocol <NSObject>
    12 -(void)Say;
    13 @end

    实现类Peason

    头文件

     1 //
     2 //  Peason.h
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "BehaviorProtocol.h"
    11 
    12 @interface Peason : NSObject<BehaviorProtocol>
    13 
    14 @property NSString *name;
    15 @property int age;
    16 
    17 -(id)initWithName:(NSString*)name Age:(int)age;
    18 
    19 @end

    实现文件

     1 //
     2 //  Peason.m
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import "Peason.h"
    10 
    11 @implementation Peason
    12 @synthesize name=_name;
    13 @synthesize age=_age;
    14 
    15 -(id)initWithName:(NSString*)name Age:(int)age
    16 {
    17     Peason* p=[[Peason alloc]init];
    18     p.name=name;
    19     p.age=age;
    20     return p;
    21 }
    22 
    23 -(void)Say
    24 {
    25     NSLog(@"%@_____%@",self,self.name);
    26 }
    27 @end

    实现类Student

    头文件

     1 //
     2 //  Student.h
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import "Peason.h"
    10 #import "BehaviorProtocol.h"
    11 
    12 @interface Student : Peason<BehaviorProtocol>
    13 -(id)initWithName:(NSString*)name Age:(int)age;
    14 @end

    实现文件

     1 //
     2 //  Student.m
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import "Student.h"
    10 
    11 @implementation Student
    12 
    13 -(void)Say
    14 {
    15     NSLog(@"My name is %@. I am student.",self.name);
    16 }
    17 
    18 -(id)initWithName:(NSString*)name Age:(int)age
    19 {
    20     Student* p=[[Student alloc]init];
    21     p.name=name;
    22     p.age=age;
    23     return p;
    24 }
    25 @end

    调用函数:

     1 //
     2 //  main.m
     3 //  01-继承和多态
     4 //
     5 //  Created by zhangjing on 15/7/5.
     6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Peason.h"
    11 #import "Student.h"
    12 #import "BehaviorProtocol.h"
    13 
    14 int main(int argc, const char * argv[]) {
    15     @autoreleasepool {
    16         id<BehaviorProtocol> p=[[Peason alloc]initWithName:@"Tom" Age:14];
    17  
    18         id<BehaviorProtocol> s=[[Student alloc]initWithName:@"Jack" Age:12];
    19         NSArray *myarray=[[NSArray alloc]initWithObjects:p,s, nil];
    20         for (id<BehaviorProtocol> object in myarray) {
    21             [object Say];
    22         }
    23  
    24     }
    25     return 0;
    26 }

    输出结果:

    2015-07-05 16:36:14.083 01-继承和多态[1593:65862] <Peason: 0x10010e090>_____Tom

    2015-07-05 16:36:14.084 01-继承和多态[1593:65862] My name is Jack. I am student.

    以上即为简单实现第二种方法实现协议实现了OC的多态。

  • 相关阅读:
    centos7 安装jmeter5.1
    centos7 安装jdk1.8
    es6学习笔记(一)环境搭建
    Django-filter报错:__init__() got an unexpected keyword argument 'name'
    django fields lookup methods(lookup类型)
    django笔记-model
    Git-简单使用
    jenkins-master-slave节点配置总结
    Git-简单使用
    MySQL explain详解
  • 原文地址:https://www.cnblogs.com/zhangjingyangjinjin/p/4622547.html
Copyright © 2020-2023  润新知