OC面向对象多态笔记
面向对象的多态是建立在继承上,可以说没有继承就没有多态;
多态:父类指针指向了子类的对象;
int main()
{
//假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是
Animal *a = [Dog d];//父类指针指向了子类对象 }
多态的定义是比较简单的,也好理解,关键在于它的指针动态绑定,究竟调用哪个方法;
#import <Foundation/Foundation.h> //Animal类的声明
@interface Animal : NSObject
{
int _legs;
} - (void)eat;
- (void)run;
@end //Animal类的实现
@implementation Animal
- (void)eat
{
NSLog(@"动物在吃东西"); } - (void)run
{
NSLog(@"动物在跑");
} @end //子类Dog 继承 Animal
@interface Dog : Animal @end
//子类dog的实现
@implementation Dog
//方法的覆盖或叫重写
- (void)eat
{
NSLog(@"狗在吃东西");
}
@end int main()
{ Animal *a = [Dog new];//虽然表面上是一个Animal指针,但是动态绑定后,实际上它指向的是Dog类型的
[a eat];//动态绑定后,输出的时狗在吃东西,即狗的eat方法 }
这样就看到了多态的好处,当有两个方法的参数都是对象,且有共同的父类时,这两个方法可以写成一个方法,只需把参数改为父类对象就可以了
//已经定义了Dog,Cat两个类,他们都继承了Animal方法,且定义了eat方法,子类都重写了eat方法
//喂猫吃东西的方法
void catEat(Cat *c)
{
[c eat];
}
//喂狗吃东西的方法
void dogEat(Dog *d)
{
[d eat];
} /******那么这两个方法就比较冗余了,可以用一个方法代替*******/ void animalEat(Animal *a)
{
[a eat];
}
虽然多态用起来减少了代码的冗余,但是由于OC弱类型编程语言的容错能力强,局限性也很明显
1:父类对象不能调用子类的特有方法,但是真得调用了,也只是一个警告,照样能够运行起来;可以用类型转换,将父类对象转成子类的对象
语法:
Animal *aa = [Dog new];
//注意强转的格式带*号
Dog *dd = (Dog *)aa;//这里的强转也只是给编译器看得,不写,也能运行,只不过编译时一个警告;
2:一个类的指针能指向一个和本类好无关系的对象,编译只是一个警告,照样能调用其中的方法;
NSString *ns = [Dog new];
[ns eat];//只是警告,但是能运行,不建议这样写;
OC面向对象多态笔记的更多相关文章
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...
- 李洪强iOS开发之OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- OC面向对象—封装
OC面向对象—封装 一.面向对象和封装 面向对象的三大特性:封装(成员变量).继承和多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴 ...
- OC面向对象的三大特征
OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...
- OC面向对象—继承
OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...
- 【基础】Equal方法、面向对象-多态-继承-封装
package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...
- Python之面向对象多态
Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...
- Java面向对象多态
Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...
随机推荐
- Spring事务传递性探讨
本篇主要讨论下面几点获取[下载地址] : 一: Spring 事务的传递性介绍 二: 第三方调用含有事务的Service抛异常方法探讨 一: Spring 事务的传递性介绍 事务传播行为,所谓事务的 ...
- DWZ(JUI) 教程 中如何整合第三方jQuery插件
Query插件一般是$(document).ready()中初始化 $(document).ready(function(){ // 文档就绪,初始化jQuery插件| }); // 或者或缩写形 ...
- SQL Server 2008数据库同步配置
以下内容转载于网络,个人做了简单的修改. 数据库同步可以是同一个服务器之间不同数据库之间数据同步,也可以是局域网内不同服务器间数据库的同步. 下面具体说一下步骤,首先我们说一下发布服 ...
- node.js安装方法总结
为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 https://nodejs.org/en/download/ 这种方式的问题是我们需要自己去找网页,找到链接,然后下载 第二个方法:使 ...
- javascript中ajax post实例详解
一,原生态的XMLHttpRequest 代码如下 复制代码 <script language="javascript"> function savei ...
- 在iOS中,实现点击搜索结果隐藏搜索结果的方法。
不知道有没有别的什么的好的方法,最近在实现一个需求(点击搜索,然后输入搜索内容,显示搜索出来的结果,然后点击搜索结果,在当前页面显示所点击的结果的详细的信息).遇到的问题是,点击搜索结果的时候,搜索的 ...
- ReactiveCocoa比较区分replay, replayLast和replayLazily
一直搞不清楚replayLazily和replay的区别可以直接跳到最后看. 原文:http://spin.atomicobject.com/2014/06/29/replay-replaylast- ...
- OC4_遵守多个协议
// // Calulator.h // OC4_遵守多个协议 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zha ...
- 《搭建DNS负载均衡服务》RHEL6
搭建DNS负载均衡环境: 1.至少三台的linux虚拟机,一台主的DNS服务器,1台副的(可以N台),1台测试机. 负载均衡有很多种,apache那样的是为了缓解人们访问网站时给服务器造成太大的压力, ...
- 锋利的jquery-选择器
1 jquery $(document).ready(function(){}) 可以简写成 $(function(){}) 2 jquery 对象和DOM对像 ① jquery对象和DOM对象不 ...