文档章节

第03天OC语言(11):多态

lyh2017iOS
 lyh2017iOS
发布于 2017/07/14 09:22
字数 858
阅读 2
收藏 0
点赞 0
评论 0
  • 不要等到明天,明天太遥远,今天就行动。

#####须读:看完该文章你能做什么?

什么是多态

#####学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

什么类、什么继承


#####一、本章笔记

 什么是多态
    某一类事物的多种形态
    猫 ->猫->动物
    狗 ->狗->动物
    男人 男人->人->高级动物
    女人 女人->人->高级动物
    
 程序中如何表示
    父类指针 指向 子类对象
    动物的指针 指向了 猫 (这就是多态) 猫是动物
    动物 *a = [猫 new];
 例子:
      动态类型 : 在编译的时候 编译只会检查 当前类型中对应的类中 有没有需要调用的方法 (也就是说command+B编译的时候 会去检查Anima 有没有eat方法)
               在运行时, 系统会自动判断a1的真实类型 (也就是说 当运行的时候 a1已经是Dog类型了 所以会去执行Dog类里面的eat方法)
     Anima *a1 = [Dog new];
     [a1 eat];
 优点: 
    提高代码的扩展性 (比如人 要喂动物 猫\狗\猪) 1>那么所有的动物都集成Anima 2>人提供一个喂动物的方法(调用动物eat方法) 3>动物都重写eat方法
     Dog *d = [Dog new];
     [Person foodAnima:d];
     Cat *c = [Cat new];
     [Person foodAnima:c];
     Pig *p = [Pig new];
     [Person foodAnima:p];
 注意点: 
    如果父类指针指向子类对象, 如果需要调用子类特有的方法,必须强制类型转换 为子类 才能调用
    Anima *a1 = [Dog new];
    // kanjia 是Dog的方法
    强制转换方式1
     Dog *d1 = (Dog *)a1;
     [d1 kanjia];
    强制转换方式2
    [(Dog *)a1 kanjia];

#####二、code ######main.m

#pragma mark 11-多态

#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类

#import "Cat.h"
#import "Dog.h"
#import "Pig.h"
#import "Person.h"

#pragma mark - main函数
int main(int argc, const char * argv[])
{
    /*
    Dog *d = [Dog new];
    [d eat];
    Cat *c = [Cat new];
    [c eat];
    */
    
#pragma mark 多态
    /*
    // 多态 : 事物的多种表现形态
    // 动态类型 : 在编译的时候 编译只会检查 当前类型中对应的类中 有没有需要调用的方法 (也就是说command+B编译的时候 会去检查Anima 有没有eat方法)
    //          在运行时, 系统会自动判断a1的真实类型 (也就是说 当运行的时候 a1已经是Dog类型了 所以会去执行Dog类里面的eat方法)
    Anima *a1 = [Dog new];
    [a1 eat];
    
    // 注意点, 在多态中, 如果想调用 子类特有的方法 必须强调类型 转换为 子类才能调用
    // [a1 kanjia]; // 错误写法 编译时报错
//    Dog *d1 = (Dog *)a1;
//    [d1 kanjia];
    [(Dog *)a1 kanjia];
     */
    
    
    Dog *d = [Dog new];
//    [Person food:d];
    [Person foodAnima:d];
    
    Cat *c = [Cat new];
//    [Person foodCat:c];
    [Person foodAnima:c];
    
    Pig *p = [Pig new];
    [Person foodAnima:p];
    
    return 0;
}

######Person

>>>.h
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Anima.h"
@interface Person : NSObject
//+ (void)food:(Dog *)d;
//+ (void)foodCat:(Cat *)c;

// 动物园
// 猴子\大象\孔雀
// 喂动物
+ (void)foodAnima:(Anima *)a;
@end

>>>.m
@implementation Person
//+ (void)food:(Dog *)d
//{
//    NSLog(@"喂狗");
//}
//+ (void)foodCat:(Cat *)c
//{
//    NSLog(@"喂猫");
//}

+ (void)foodAnima:(Anima *)a
{
    [a eat];
}
@end

######Anima

>>>.h
#import <Foundation/Foundation.h>

@interface Anima : NSObject
{
    int _age;
}
- (void)eat;
@end
>>>.m
#import "Anima.h"

@implementation Anima
- (void)eat
{
    NSLog(@"啃骨头");
}
@end

######Dog

>>>.h
#import <Foundation/Foundation.h>
#import "Anima.h"
@interface Dog : Anima
- (void)kanjia;
@end

>>>.m
@implementation Dog
- (void)eat
{
    NSLog(@"啃骨头");
}
- (void)kanjia
{
    NSLog(@"看家");
}
@end

######Cat

>>>.h
#import <Foundation/Foundation.h>
#import "Anima.h"
@interface Cat : Anima

- (void)eat;

@end
>>>.m
#import "Cat.h"

@implementation Cat
- (void)eat
{
    NSLog(@"吃鱼");
}
@end

######Pig

>>>.h
#import <Foundation/Foundation.h>
#import "Anima.h"
@interface Pig : Anima

@end
>>>.m
#import "Pig.h"

@implementation Pig
- (void)eat
{
    NSLog(@"大口吃");
}
@end

image.png

© 著作权归作者所有

共有 人打赏支持
lyh2017iOS
粉丝 1
博文 354
码字总数 137380
作品 0
朝阳
oc 类和对象

一 、oc语言的特点 C语言的超集,允许在oc中使用c语言源代码,编译器兼容C语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 二、基本介绍 面向对象编程OOP(Object Oriented Pro...

黑伞将军 ⋅ 2015/08/03 ⋅ 0

IOS常见问题

1.Difference between shallow copy and deep copy? 浅复制和深复制的区别? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意思就是说我有个...

王斌_Duke ⋅ 2015/08/11 ⋅ 0

简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机 ⋅ 2016/08/17 ⋅ 0

简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机 ⋅ 2016/08/17 ⋅ 0

简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机 ⋅ 2016/08/17 ⋅ 0

iphone开发技术要学习的内容

一.iOS基础   1 开发环境搭建以及IOS组件、框架的概要介绍。   2 mac操作系统与iOS操作系统   3 xcode IDE开发环境的初始   二.C语言基础   1数据类型、表达式与控制流程语句   ...

和谐中原植物酒 ⋅ 2015/08/24 ⋅ 2

「Objective-C基础」三大特性:封装、继承、多态

我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这三大特性是学习类的时候,必须理解的问题,既是基础,更该给予重视。 一、封装(Encapsulation) 封装就是对类中的一些...

无忌不悔 ⋅ 2017/08/08 ⋅ 0

Objective-C原理系列(一)

Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对象语言。是一种静态输入的语言,即“必须先声明数据中每个变量(或者容器)的数据类型”。但它是一个动态语...

FTD_SL ⋅ 2016/08/17 ⋅ 0

Objective-C文字总结

多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据...

Anyi_安一 ⋅ 2015/10/13 ⋅ 0

OC学习篇之---代理模式

在前一篇文章我们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清...

jiangwei0910410003 ⋅ 2014/12/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 30分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部