当前位置: 首页 > news >正文

OC多态

要点:

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


2、类与类之间有关系,继承关系
父类的引用可以指向子类的引用或者本类的引用。
父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。
父类的引用指向本类的对象,发送消息,调用本类的方法。


3、编译期类型和运行期类型
*在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。
*在调用方法时,发现确实是子类对象,为子类类型创建空间。

Animal* animal = [[Dog alloc] init];

编译时,把Dog类型当成Animal类型编译。运行时,调用的是Dog类型的对象。

 

代码分析: A是父类,B继承A,C继承B

A中:

#import <Foundation/Foundation.h>

@interface A : NSObject

- (void)show;

@end

 

#import "A.h"

@implementation A

- (void)show
{
    NSLog(@"A show");
}

@end

B中:

#import "A.h"

@interface B : A

- (void)show;

@end
#import "B.h"

@implementation B

- (void)show
{
    NSLog(@"B show");
}


@end

C中:

#import "B.h"

@interface C : B

-(void)show;


@end
#import "C.h"

@implementation C

- (void)show
{
    NSLog(@"C show");
}

@end

 

在main.m中

        //A类型的指针 指向A类型的对象
        A *a = [[A alloc]init];
        [a show];
        
        //多态
        //父类指针 指向 子类对象
        B *b = [[B alloc]init];
        //这里b show 是调用哪个方法呢?
        [b show];
        //动态监测-调用方法时候会监测对象的真实类型
        
        
        //C也一样
        C *c  = [[C alloc]init];
        [c show];    

 

输出结果:

A show
B show
C show

 

相关文章:

  • C标准I/O库函数与Unbuffered I/O函数
  • error: insufficient permissions for device: verify udev rules
  • python爬虫中文网页cmd打印出错问题解决
  • Lambda 表达式(C# 编程指南) 微软microsoft官方说明
  • (一)WLAN定义和基本架构转
  • 一道闭包题引发的思考
  • 循环 函数 软件包 【中】
  • Blue Moon响应式后台管理模板
  • 用UltraISO把硬盘文件制作成ISO格式
  • 深入理解SELinux SEAndroid
  • Android初级进阶之自定义View之SafeVeiw
  • 源码安装http2.2.29
  • Making An Indicator With Pure CSS
  • python编程中的if __name__ == 'main': 的作用和原理
  • [raspberry pi3] zram设置
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • bearychat的java client
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Redis学习笔记 - pipline(流水线、管道)
  • scala基础语法(二)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 给第三方使用接口的 URL 签名实现
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 猴子数据域名防封接口降低小说被封的风险
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 王永庆:技术创新改变教育未来
  • 译有关态射的一切
  • 如何用纯 CSS 创作一个货车 loader
  • ​ubuntu下安装kvm虚拟机
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #1014 : Trie树
  • #宝哥教你#查看jquery绑定的事件函数
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (独孤九剑)--文件系统
  • (实战篇)如何缓存数据
  • (五)MySQL的备份及恢复
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)VC++中ondraw在什么时候调用的
  • (转)编辑寄语:因为爱心,所以美丽
  • (轉貼) UML中文FAQ (OO) (UML)
  • .apk文件,IIS不支持下载解决
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ 第一章] JavaScript 简史
  • [Angular] 笔记 6:ngStyle
  • [Bugku]密码???[writeup]
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)