/**
* 多态:多种形态,是对于对象而言的,如果没有继承就没有多态
*
* 在代码中体现:就是通过定义父类指针指向子类的对象
*
* 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候可以传入父类或者子类对象  比如多个子类在完成同一个动作的时候,可以直接将父类指针作为参数传入,那么子类在实现的时候就可以将子类作为参数直接调用方法而完成功能。否则就要为每       一个子类写一个方法,这样就可以省略代码。 局限性:父类类型的指针不能直接访问子类中特别的方法,如果要调用的话必须把父类的指针强制转换成为子 类类型
*
*/ #import <Foundation/Foundation.h> /************* Animal *************/
@interface Animal : NSObject
- (void)eat;
@end @implementation Animal
- (void)eat
{
NSLog(@"动物在吃东西");
}
@end /************* Dog *************/
@interface Dog : Animal
- (void)eat;
@end @implementation Dog
- (void)eat
{
NSLog(@"狗在吃东西");
}
@end /************* Cat *************/
@interface Cat : Animal
- (void)eat;
- (void)catchMouse;
@end @implementation Cat
- (void)eat
{
NSLog(@"猫在吃东西");
}

- (void)catchMouse
{
NSLog(@"猫抓老鼠");
}
@end // "喂"所有的动物 定义函数实现
void feed(Animal *animal)
{
NSLog(@"给一块骨头");
} // main方法
int main()
{
// 对象的第一种形态:以“狗”的形态存在
Dog *dog1 = [Dog new]; /*
对象的第二种形态这种形态:以“动物”的形态存在
就是父类的指针指向子类的对象 定义一个“动物指针”dog2,指向“狗”类的对象的地址
*/ Animal *dog2 = [Dog new]; /*
执行的时候会动态检测对象dog2的真实类型!是父类“Ainimal“呢还是子类”Dog”呢
打印结果是:狗在吃东西
说明dog2这个父类指针,在内存中指的还是子类”Dog“的内存地址,因此执行的是Dog类里面的方法
因此dog2还是”Dog“类型
*/ [dog2 eat]; // 动态检测dog2到底是什么类型 /*
需求:喂”狗“和”猫“吃骨头 体现多态的优点
这样的话:就可以直接通过在函数中定义的父类指针指向所有的子类对象
这样写就可以直接在一个函数中完成”喂“和”狗“和”猫“的需求
*/
Dog *dog3 = [Dog new];
feed(dog3); Cat *cat = [Cat new];
feed(cat); /*
多态的局限性:父类的指针不能直接访问子类特有的方法
*/ Animal *cat1 = [Cat new]; /*
[cat1 catchMouse]; 这样写在xCode中报错,在命令行工具中只是警告可以运行!
cat1虽然是父类的指针,但是它指向的就是Cat类那么应该可以访问到Cat类里面的方法!
但是编译器会认为cat1是Animal类型,会在Animal类中寻找catchMouse方法,找不到结果报错!
*/ // 强制转换指针类型就可以了
Cat *c = (Cat *)cat1; // 首先将父类指针转换成为子类Cat的类型
[c catchMouse]; // 这样编译器认为catchMouse是在子类中,然后寻找到就不报错了! }

iOS 多态的简单思想的更多相关文章

  1. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  2. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

  3. ios下最简单的正则,RegexKitLite

    ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...

  4. iOS中XMPP简单聊天实现 好友和聊天

    版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;微信公众号:陈怀哲(chenhuaizhe2016) ...

  5. iOS百度地图简单使用详解

    iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...

  6. IOS多态在项目中的应用

    今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...

  7. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  8. iOS百度地图简单使用

    本文介绍三种接口: 1.基础地图2.POI检索3.定位 首先是配置环境,有两种方法,方法在官方教程里都有,不再多说 1.使用CocoaPods自动配置[这个方法特别好,因为当你使用CocoaPods配 ...

  9. iOS On-Demand Resources简单理解

    ios9引入了一个新功能,On-Demand Resources,它是app thinning 的一部分.这个机能简单的说,就是在下载app的时候,app中包含的不重要资源不下载,等到需要时,在由系统 ...

随机推荐

  1. Jfinal极速开发微信系列教程(一)--------------Jfinal_weixin demo的使用分析

    概述: Jfinal_weixin已经出了有好一段时间了!一直在关注当中......最近工作上有需要到这个东西,所以,话了两个小时来看看这个东西,看完demo以后,豁然开朗,原理微信和一般的web项目 ...

  2. Design Pattern Explained 读书笔记二——设计模式序言

    设计模式的由来: 20 世纪 90 年代初,一些聪明的开发者偶然接触到 Alexander(Christopher Alexander 的建筑师) 有关模式的工作.他们非常想知道,在建筑学成立的理论, ...

  3. android 基于百度地图api开发定位以及获取详细地址

    一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView ...

  4. js 数组排序要注意的问题,返回的值最好为 -1, 0, 1之间的值

    var test10Elements = [7, 6, 5, 4, 3, 2, 1, 0, 8, 9]; var comparefn = function (x, y) { return x - y; ...

  5. 查看MAC系统JRE和JDK版本

    经常有些软件有JRE或者JDK的版本要求,但怎么查询MAC上现在的JRE或JDK的版本呢?很简单,用这两个命令 这个是查询JRE的版本: $ java -version java version &q ...

  6. keyStore vs trustStore--转载

    原文:http://lukejin.iteye.com/blog/605634 今天有同事向我问起这两个概念,所以我就记录下.首先我们得澄清一些概念.一个web应用如果需要提供以https的方式访问的 ...

  7. 使用apache common-io 监控文件变化--转

    package common.io; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.common ...

  8. 用keytool生成证书

    1.创建一个证书C:/jdk1.5.0_04/bin>keytool -genkey -alias xahCA -keyalg RSA -keystore dyfCALib输入keystore密 ...

  9. iOS 中的 block 是如何持有对象的

    Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...

  10. swift项目中嵌入oc

    参考资料 需要注意的是  与oc包含swift不同的是  swift包含oc需要在桥接文件中包含要使用的oc的头文件 demo:swiftPlayOc(提取码:37c6)