OC——多态
书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看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——多态的更多相关文章
- OC 多态
OC 多态 多态的概念 没有继承,就没有多态 不同类的对象能够定义相同名称的方法 当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法 C++只有虚函数才能实现多态,OC中所有方法都可 ...
- OC多态
要点: 1.多种形态,引用的多种形态对于一个引用变量,可以指向任何类的对象.对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同.当通过此引用向对象发送消息,调 ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- iPhone开发视频教程 Objective-C部分 (51课时)
第一.二章 OC基础语法 iPhone开发教程 第一章 OC基础语法 iPhone开发概述-必看(1.1)http://www.apkbus.com/android-102215-1-1.html ...
- (转载)iPhone开发视频教程 Objective-C部分 (51课时)
感谢好人的无私贡献!来源:http://www.cnblogs.com/aimeng/p/3370012.html 第一.二章 OC基础语法 iPhone开发教程 第一章 OC基础语法 i ...
- iPhone开发视频教程 Objective-C部分
第一.二章 OC基础语法 iPhone开发教程 第一章 OC基础语法 iPhone开发概述-必看 (1.1) http://www.apkbus.com/android-102215-1-1.ht ...
- OC基础--多态 及 三特性小练习
什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 --> ...
- OC的封装、继承与多态
面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...
- 多态 oc c++ 与oc category
多态是函数调用的动态绑定技术: c++动态绑定依赖于this指针与虚函数表. 虚函数表的排序规则: 1)虚函数按照其声明顺序放于表中. 2)父类的虚函数在子类的虚函数前面. 3)如果子类重写了父类的虚 ...
随机推荐
- 带你走进SAP项目实施过程——前言(0)
欢迎关注博主的微信公众号,每天提供原创的SAP技术和项目管理新资讯! 一直很想写一些关于SAP项目管理以及实施过程的系列文章,讲述企业SAP项目从立项开始到启动,再到实施过程,直到最后的上线及总结.我 ...
- ubuntu下安装rubymine
1.安装jdk 先查看系统有没有安装jdk,打开终端,输入以下命令: java -version 如果没有安装,在联网的环境下执行: $ -jdk 2.安装rubymine 从官网(http://ww ...
- thinkjs—控制器方法名不能大写
async updateInfoAction(){ ... } 上面的接口如果通过ajax访问,就会报404的错误.原因似乎在于访问updateInfo时,会自动转化成小写,而小写的updateinf ...
- python基础教程(七)
本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事. 下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数) fibs = [0,1] # 定义一个列表,初始内容是0,1 for i ...
- 快速排序/快速查找(第k个, 前k个问题)
//快速排序:Partition分割函数,三数中值分割 bool g_bInvalidInput = false; int median3(int* data, int start, int end) ...
- jmeter-fileupload操作使用说明
前言:在http请求过程中上传附件(图片.安装包.视频文件等)虽然基本上Content-Type为:multipart/form-data,但Content-Type也有不一样的,如:图片Conten ...
- 堆排序Java实现
package practice; import edu.princeton.cs.algs4.StdRandom; public class TestMain { public static voi ...
- jvm系列 (五) ---类加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- JavaScript二维码生成——qrcode.js
在开发中,有时候,我们需要根据不同的内容来动态生成二维码,则可以使用qrcode.js这个小插件来实现. 1.qrcode.js文件内容: (1)未压缩(qrcode.js): /** * @file ...
- 软工+C(2017第8期) 提问与回复
// 上一篇:野生程序员 // 下一篇:助教指南 在线上博客教学里引入了第三方助教,助教在每次作业期间尽力完成"消灭零点评"的目标.然而紧接而来的问题是:学生对博客作业点评的回复率 ...