多态

多态 一直是面向对象编程的重要思想.也是OC编程绕不开的话题.自己写代码也经常对这些定义性的东西突然就恍然大明白的感觉.记录每次在在工作中对这些有着明确定义的特性的理解.进入正题. 所谓多态,顾名思义就是有多重状态.再说白就是我叫A 但我不一定是A.我也有可能是B.这也基于oc是动态语言的特性.在编译时决定.多态在OC中的体现主要是继承.

下面 我们通过一个例子来说: 人喂动物的例子 创建一个 MultiPerson的类:

@interface MultiPerson : NSObject
- (void) feedAnimalFood:(MultiAnimal *)animal;
@end#import "MultiPerson.h"@implementation MultiPerson
- (void)feedAnimalFood:(MultiAnimal *)animal {[animal eatFood];
}
@end

创建动物类

@interface MultiAnimal : NSObject
- (void)eatFood;
@end#import "MultiAnimal.h"@implementation MultiAnimal
-(void)eatFood {}
@end

创建猫和狗类

//:猫
#import "MultiAnimal.h"
@interface MultiCat : MultiAnimal@end#import "MultiCat.h"@implementation MultiCat
- (void)eatFood {NSLog(@"喂猫咪吃猫粮");
}@end//狗子
@interface MultiDog : MultiAnimal@end#import "MultiDog.h"@implementation MultiDog
- (void)eatFood {NSLog(@"喂狗子吃狗粮");
}@end

人喂动物:

    //:人MultiPerson *p = [[MultiPerson alloc]init];//:猫MultiCat *cat = [[MultiCat alloc]init];//:狗MultiDog *dog = [[MultiDog alloc]init];//:喂猫[p feedAnimalFood:cat];[p feedAnimalFood:dog];

person 接受的是animal的类型但实际传入的是猫或者是狗子.这就是多态.

多继承

多继承意思就是可以有多个父类.但是在OC语言中,只能实现单继承.但是我们可以通过其他的路径实现多继承.

  • 第一种:协议 这个就不多说了,就是遵循代理来执行某个类的方法.

  • 第二种:消息转发 消息转发iOS runtime 消息转发机制原理和实际用途
    意思就是我们可以在运行时来通过消息转发,将当前消息转发给某一个类.到达一个类执行执行多个类的方法的目的.

  • 第三种:就是NSProxy 就是NSProxy不是继承NSProject,在运行过程中可以伪装成任何对象.其实也是消息转发

SmallCat *cat = [[SmallCat alloc]init];SmallDog *dog = [[SmallDog alloc]init];SXProxy *proxy = [SXProxy alloc];[proxy transformObjc:cat];[proxy performSelector:@selector(eat:) withObject:@"猫咪吃东西饿了"];[proxy transformObjc:dog];[proxy performSelector:@selector(shut)];

内部实现:


@interface SXProxy : NSProxy
- (void)transformObjc:(NSObject *)objc;
@end#import "SXProxy.h"
@interface SXProxy ()
/****/
@property (nonatomic, strong) NSObject *objc;
@end
@implementation SXProxy
- (void)transformObjc:(NSObject *)objc{//:复制对象self.objc = objc;
}
#pragma mark ---2有了方法签名之后 就会调用这个方法
-(void)forwardInvocation:(NSInvocation *)invocation{if (self.objc) {//:拦截方法的执行者 吧复制的对象 作为执行者[invocation setTarget:self.objc];if ([self.objc isKindOfClass:[NSClassFromString(@"Cat") class]]) {NSString *str = @"拦截消息";[invocation setArgument:&str atIndex:2];}//:调用方法[invocation invoke];}
}
#pragma mark --1查询该方法的 方法签名
-(NSMethodSignature *)methodSignatureForSelector:(SEL)sel{NSMethodSignature *signature = nil;if ([self.objc methodSignatureForSelector:sel]) {signature = [self.objc methodSignatureForSelector:sel];}else{signature = [super methodSignatureForSelector:sel];}return signature;
}
@end

这里有一个iOS开发交流群:130595548!如果你也是一个有梦想的iOS开发者,欢迎你的加入!

iOS 多态和多继承相关推荐

  1. 什么是多态 重载 覆盖 继承 最好解释

    多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用程序函数同名问题. 多态有两种表现形式:重载和覆盖 ...

  2. Java三大特性(封装,继承,多态)之一 -----继承

    目录 一.继承的基本概念与规则 1.继承的概念 2.继承的关键字 3.继承的结果 二.继承代码 1.继承之---最简单继承 2.继承之---构造器加入 3.继承之---多态转型 3.继承之---抽象类 ...

  3. ios开发动物园管理 继承多态的实现

    // // main.m // 继承 ////#import <Foundation/Foundation.h> #import "Animal.h" #import ...

  4. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

  5. php中可以实现多态的是继承,PHP设计模式通过继承实现多态

    /* ?* WEB开发笔记 www.chhua.com 每日练习之PHP设计模式继承的实现 ?*/ /* ?* 类说明:某大学开两门课程,一个是PHP,一个是JAVA,规定不同的价格 ?*/ abst ...

  6. python基础教程:多态、多继承、函数重写、迭代器详细教程

    用于类的函数 issubclass(cls,class_or_tuple) 判断一个类是否继承自其他的类,如果此类cls是class或tuole中的一个派生(子类)则返回True,否则返回False ...

  7. Python 中类的继承:属性初始化、类型判断、多态、多继承和对象信息的获取

    属性初始化: 一定要用super(Teacher, self).__init__(name, gender)去初始化父类,否则,继承自 Person 的 Teacher 将没有 name 和 gend ...

  8. Golang——接口、多态、接口继承与转换、空接口、类型断言

    接口是一种规范与标准,只是规定了要做哪些事情.但是具体怎么做,是实现接口的类去做的,接口只是把所有具有共性的方法定义在一起. 接口存在的意义就是用来定义规范,用来做功能的拓展 接口最大的好处是可以实现 ...

  9. java多态 覆盖_Java ------ 继承、方法覆盖、多态

    一.什么是继承 面向对象的三大特性: 封装. 继承.多态: 继承就是子类型将父类型的的属性继承到自己类中进行使用,通过继承的方式子类型可以使用父类型的属性和方法,并且,继承只能单重继承,无法多继承,但 ...

最新文章

  1. VsCode 开发工具中英文切换
  2. 对象之function
  3. com.mysql.jdbc.PacketTooBigException: Packet for query is too large
  4. java的文本框如何回车键触发按钮_java回车触发按钮的代码
  5. 7-3 逆序的三位数 (10 分)
  6. gin 静态文件服务器拒绝,nginx实现简单的图片服务器(windows)+静态文件服务器-Go语言中文社区...
  7. 后端返回页面ajax的处理
  8. checkValidity()验证输入信息合法性,自定义错误提示信息方法及误区
  9. android传感器_Android传感器
  10. 时代变迁,台湾的这个优势产业即将被中国大陆取代
  11. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect database name ‘dongdong_1
  12. 平均年龄c加加语音用switch_一个资深C加加工程师说如何学习C语言
  13. Java程序员找工作很难吗?可能没有get这些内容
  14. OPPOR9Android 6.0过程,超简单 OPPOR9升级Android 6.0系统 详细教程
  15. 读《中国通史》(1)
  16. 【数论】同余(五):多元线性同余方程
  17. 祝我亲爱的天蝎GG生日快乐!+相识3周年小纪念【转载】
  18. 目标跟踪算法综述与分析
  19. android x86 v2ex,v2ex-android
  20. 《nodejs实战》读书笔记

热门文章

  1. PostgreSQL扫描方法综述
  2. 一文给你解决linux内存源码分析- SLUB分配器概述(超详细)
  3. java syn包_月薪3K的后端面试点-网络与Java
  4. shell命令查阅端口信息_Linux服务器管理Shell经典命令
  5. Linux关闭防火墙命令总结
  6. ASP.NET MVC5 实现基于Quartz.NET任务调度
  7. docker容器创建
  8. 每日一道leetcode(python)1823. 找出游戏的获胜者
  9. Nginx下载、安装与使用
  10. 大计基编程题(第十一周)