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

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

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

一、继承的实现

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

调用方法:

 //
// main.m
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Peason.h"
#import "Student.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
Peason* p=[[Student alloc]initWithName:@"Tom" Age:];
[p Say];
Student* s=[[Student alloc]initWithName:@"Jack" Age:];
[s Say];
}
return ;
}

输出结果:

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方法的结果

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

二、实现协议实现

协议:

 //
// BehaviorProtocol.h
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import <Foundation/Foundation.h> @protocol BehaviorProtocol <NSObject>
-(void)Say;
@end

实现类Peason

头文件

 //
// Peason.h
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import <Foundation/Foundation.h>
#import "BehaviorProtocol.h" @interface Peason : NSObject<BehaviorProtocol> @property NSString *name;
@property int age; -(id)initWithName:(NSString*)name Age:(int)age; @end

实现文件

 //
// Peason.m
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import "Peason.h" @implementation Peason
@synthesize name=_name;
@synthesize age=_age; -(id)initWithName:(NSString*)name Age:(int)age
{
Peason* p=[[Peason alloc]init];
p.name=name;
p.age=age;
return p;
} -(void)Say
{
NSLog(@"%@_____%@",self,self.name);
}
@end

实现类Student

头文件

 //
// Student.h
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import "Peason.h"
#import "BehaviorProtocol.h" @interface Student : Peason<BehaviorProtocol>
-(id)initWithName:(NSString*)name Age:(int)age;
@end

实现文件

 //
// Student.m
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import "Student.h" @implementation Student -(void)Say
{
NSLog(@"My name is %@. I am student.",self.name);
} -(id)initWithName:(NSString*)name Age:(int)age
{
Student* p=[[Student alloc]init];
p.name=name;
p.age=age;
return p;
}
@end

调用函数:

 //
// main.m
// 01-继承和多态
//
// Created by zhangjing on 15/7/5.
// Copyright (c) 2015年 zhangjing. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Peason.h"
#import "Student.h"
#import "BehaviorProtocol.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
id<BehaviorProtocol> p=[[Peason alloc]initWithName:@"Tom" Age:]; id<BehaviorProtocol> s=[[Student alloc]initWithName:@"Jack" Age:];
NSArray *myarray=[[NSArray alloc]initWithObjects:p,s, nil];
for (id<BehaviorProtocol> object in myarray) {
[object Say];
} }
return ;
}

输出结果:

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的多态。

OC——多态的更多相关文章

  1. OC 多态

    OC 多态 多态的概念 没有继承,就没有多态 不同类的对象能够定义相同名称的方法 当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法 C++只有虚函数才能实现多态,OC中所有方法都可 ...

  2. OC多态

    要点: 1.多种形态,引用的多种形态对于一个引用变量,可以指向任何类的对象.对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同.当通过此引用向对象发送消息,调 ...

  3. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  4. iPhone开发视频教程 Objective-C部分 (51课时)

    第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  iPhone开发概述-必看(1.1)http://www.apkbus.com/android-102215-1-1.html ...

  5. (转载)iPhone开发视频教程 Objective-C部分 (51课时)

      感谢好人的无私贡献!来源:http://www.cnblogs.com/aimeng/p/3370012.html   第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  i ...

  6. iPhone开发视频教程 Objective-C部分

    第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  iPhone开发概述-必看 (1.1) http://www.apkbus.com/android-102215-1-1.ht ...

  7. OC基础--多态 及 三特性小练习

    什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 --> ...

  8. OC的封装、继承与多态

    面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...

  9. 多态 oc c++ 与oc category

    多态是函数调用的动态绑定技术: c++动态绑定依赖于this指针与虚函数表. 虚函数表的排序规则: 1)虚函数按照其声明顺序放于表中. 2)父类的虚函数在子类的虚函数前面. 3)如果子类重写了父类的虚 ...

随机推荐

  1. Linux主分区,扩展分区,逻辑分区的联系和区别

    主分区,也称为主磁盘分区,和扩展分区.逻辑分区一样,是一种分区类型.主分区中不能再划分其他类型的分区,因此每个主分区都相当于一个逻辑磁盘(在这一点上主分区和逻辑分区很相似,但主分区是直接在硬盘上划分的 ...

  2. 权限大全-linux基础

    一.文件权限 (1)文件的权限主要针对三类对象定义: u:属主,owner    g:属组,group    o:其他,other    权限有三种:    r:可读    w:可写    x:可执行 ...

  3. 渗透常用手工SQL注入语句合集

    1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select ...

  4. 转每天一个linux命令(7):mv命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  5. ID3算法(1)

    1 简述1.1    id3是一种基于决策树的分类算法,由J.Ross Quinlan在1986年开发.id3根据信息增益,运用自顶向下的贪心策略建立决策树.信息增益用于度量某个属性对样本集合分类的好 ...

  6. hdu3416 Marriage Match IV(最短路+网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3416 题意: 给出含n个点.m条有向边的图,每条边只能走一次,给出起点和终点,求起点到终点的最短路径有 ...

  7. Sentry的安装搭建与使用

    业务监控工具 Sentry 的搭建与使用 官方网址 Django Sentry 官网链接 Sentry 简介 Sentry 是一个开源的实时错误报告工具,支持 web 前后端.移动应用以及游戏,支持 ...

  8. http长连接与短连接

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp23 http长连接与短连接 一.长连接与短连接: 长连接:client方与 ...

  9. Centos6.6下安装Python3.5

    centos6.6自带的Python2.6,如果想要安装新版本的Python例如Python2.7+或者Python3.5,不能够用yum安装,那么只能从源码编译安装. Step 1: 安装依赖库和编 ...

  10. mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令

    Mysql 下载地址https://dev.mysql.com/downloads/mysql/ 1.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYS ...