Objective-C 【多态】
———————————————————————————————————————————
多态的概念、实现以及注意事项
程序中的多态:不同的对象 以自己的方式去 响应 相同方法名(父类同名的方法) 的能力称为多态。
多态的条件:有继承关系、有方法的重写(对应上面一条“以自己的方式”)
用父类类型的指针指向了子类对象
代码体现:用父类类型的指针指向了子类对象,这就是多态
狗 *g=[狗 new];
动物 *g=[狗 new]; (动物类的指针指向了狗类新声明的实例对象)
多态的优点:多态的好处就是 简化了编程接口,它容许 在类和类之间重用一些习惯性的命名。而不用为每一个新加的函数命名一个新名字。这样编程借口就是一些抽象的行为的集合,从而实现接口的类区分开来。
一段代码:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)run;
@end
@interface Dog : Animal
-(void)eat;
@end
@interface Cat : Animal
@end
@interface BigYellowDog : Dog
@end
@implementation Animal
-(void)run
{
NSLog(@"Animal run!");
}
@end
@implementation Dog
-(void)run
{
NSLog(@"Dog run!");
}
-(void)eat
{
NSLog(@"Dog eat!");
}
@end
@implementation Cat
-(void)run
{
NSLog(@"Cat run!");
}
@end
@implementation BigYellowDog
-(void)run
{
NSLog(@"BYDog run!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *a1=[BigYellowDog new];//BigYellowDog虽然不是Animal的子类,但是他的父类的父类是Animal类,所以BigYellowDog也是继承了Animal类,可以重写Animal的方法
[a1 run];
Animal *a2=[Dog new];
[a2 run];
Animal *a3=[Cat new];
[a3 run];
Animal *a4=[Animal new];
[a4 run];
// 以上四个实例对象,直到执行时才能确定对象的所属类型
// 直到执行时才能确定对象调用的实际方法
// OC不同于传统设计语言,他可以在运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
// 那么,父类能不能调用子类特有的方法呢?(不是继承父类的方法)
Animal *a5=[Dog new];
// [a5 eat]; //这样写是不对的,编译的时候会报错。(虽然说我们知道a5就是Dog类型的,但是需要在执行/运行的过程中我们才会知道他是一个什么类型,现在我们只是知道a5是一个Animal类型,所以这里会编译出错)
[(Dog *)a5 eat];//如果要让父类非要访问子类特有方法,那么应该使用强制类型转换。(这里为什么说是父类访问子类呢,因为我们声明的时候系统还是认为这个实例对象是属于父类的,而真正作为子类对象是在执行过程中系统才认定的,所以说在编译的时候系统并不认为他是子类的)
// 那么,这样会不会正确访问呢?
Animal *a6=[Animal new];
// [(Dog *)a6 eat]; //这样调用显然是错误的,我们虽然强制类型转换了,但是我们只是在编译的时候骗了编译器而已,他实际上在骨子里还是父类的实例对象,父类是没有eat这个方法的,强制类型转换也得看能不能转才行。虽然编译不会报错,但是运行就会出错了。
}
return 0;
}
———————————————————————————————————————————
版权声明:本文为博主原创文章,未经博主允许不得转载。
Objective-C 【多态】的更多相关文章
- Objective C多态
面向对象的封装的三个基本特征是.继承和多态. 包是一组简单的数据结构和定义相关的操作在上面的其合并成一个类,继承1种亲子关系,子类能够拥有父类定的成员变量.属性以及方法. 多态就是指父类中定义的成员变 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective 多态
多态的特点 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了. ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- iOS开发核心语言Objective C —— 全部知识点总结
本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...
- iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法
本分享是面向有意向从事iOS开发的伙伴们.或者已经从事了iOS的开发人员.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础,建议您先翻阅我之前分享的iOS ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- Java中的多态
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
随机推荐
- [iOS基础控件 - 5.4] 广告分页代码(UIScrollView制作)
A.概念 例子就是桌面的APP列表,当APP数量超过一个屏幕,自动进行分页 B.实现思路 1.创建一个UIScrollView,这里设置为宽度跟屏幕相同,高度1/4屏幕高度左右 2.使用代码在UI ...
- 转载 在.net中使用GAC
转载出处 https://blog.log4d.com/2011/01/gac/ GAC GAC是什么?是用来干嘛的?GAC的全称叫做全局程序集缓存,通俗的理解就是存放各种.net平台下面需要使用的d ...
- sonne_game网站开发03 spring-mvc+freemarker整合
今天的任务就是在spring+mybatis+springmvc的基础上,将freemarker整合进来. freemarker是什么? freemarker是一种模板引擎.它的目的是基于模板和数据, ...
- Linux基本操作 9----- 认识与学习bash
一 认识bash这个shell 1 管理整个计算机硬件的其实就是操作系统的内核,这个内核是需要被保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想打到的工作. 2 只要能够 ...
- iOS开发 autoResizingMask使用
autoResizingMask 是UIView的一个属性,在一些简单的布局中,使用autoResizingMask,可以实现子控件相对于父控件的自动布局. autoResizingMask 是UIV ...
- Linux下修改Oracle监听地址
如果你的服务器换了ip怎么办? 如果你的服务器换了名字怎么办? 以前的小伙伴怎么办? 以前的老客户怎么办? 没关系,简单教你修改监听地址,老朋友随便找! 想要修改监听地址首先要找到两个文件,确定两样东 ...
- Uploadify 3.2 参数属性、事件、方法函数详解
一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...
- OpenResty
- Zmodem transfer canceled by remote side
linux sz命令时报这个错误,看了一头雾水. 仔细看了一下发现竟然是要sz的文件名称写错了,抱着个错误和误导人呢.估计路径写错了也是这个错误.
- iOS开发——UI篇OC篇&UICollectionView详解+实例
UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2. ...