美文网首页
05-面向对象语法-多态

05-面向对象语法-多态

作者: SnorlaxSE | 来源:发表于2017-09-15 16:48 被阅读0次

多态(父类指针指向子类对象)
1.代码体现:父类类型的指针指向子类对象;

2.好处:如果函数、方法形参中使用的是父类类型,就可以传入父类、子类对象;

3.局限性:父类类型的变量不能直接调用子类特有的方法,必须强转为子类类型后才能直接调用子类特有方法

4.代码练习:

#import <Foundation/Foundation.h>

@interface Animal : NSObject
- (void)eat;
@end

@implementation Animal
- (void)eat
{
   NSLog(@"Animal---吃东西");
}
@end


@interface Dog : Animal
- (void)run;
@end

@implementation Dog
- (void)eat
{
   NSLog(@"Dog---吃东西");
}
- (void)run
{
   NSLog(@"狗跑起来了");
}
@end

@interface Cat : Animal

@end

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

// 喂狗
void feed(Dog *d)
{
   [d eat];
}

// 喂猫
void feed2(Cat *c)
{
   [c eat];
}

// 由于喂狗和喂猫的代码基本一致,所以考虑将其抽取到一个函数内
// 多态的好处:如果形参中使用的是父类类型,就可以传入父类、子类对象
void feed3(Animal *a)
{
   [a eat];
}

int main()
{
   /***************1.多态的基本使用******************/
   
   // 多态:父类指针指向子类对象
   Animal *a = [Dog new];
   
   // 调用方法时会动态检测对象的真实类型,这里对象a的真实类型是Dog
   [a eat]; // 输出:Dog---吃东西
   
   
   /***************2.OC的弱语法******************/
   
   /* 注意点:
    OC的弱语法:这里仅仅是一个警告(warning: incompatible pointer types initializing 'Dog *' with an expression of type 'Animal *' [-Wincompatible-pointer-types])
    */
   // Dog *d = [Animal new]; // 虽然仅仅是一个警告,但是在意思上不合理(动物是狗)
   
   // [d eat]; // 输出:Animal---吃东西
   
   
   /***************3.多态的好处******************/
   // 多态的好处:如果形参中使用的是父类类型,就可以传入父类、子类对象
   
   Dog *d2 = [Dog new];
   feed(d2);
   
   Cat *c2 = [Cat new];
   feed2(c2);
   
   Dog *d3 = [Dog new];
   feed3(d3);
   
   Cat *c3 = [Cat new];
   feed3(c3);
   
   /***************4.多态的局限性******************/
   
   Dog *dd = [Dog new]; // Dog类型
   
   Animal *aa = [Dog new]; // Animal类型
   
   // OC的弱语法: warning: 'Animal' may not respond to 'run'
   // 对于编译器来讲,编译器认为aa的类型是Animal,这里[aa run]就会去Animal中找是否有run的具体实现,没有找到就会警告,但是
           还是会运行成功,因为在运行是会动态检测aa的真实类型(Dog),Dog类中有run方法的具体实现,就能正常运行
   // 多态的局限性:父类类型的变量不能用来调用子类特有的方法
   // [aa run];
   
   // 对于上面的问题,可以将aa强制转换成Dog类型,编译器就不会警告
   Dog *dd = (Dog *)aa; // 将aa强制转换成Dog *类型
   
   [dd run];
   
   
   return 0;
}

原文:http://www.cnblogs.com/unique-ios/p/4322564.html

相关文章

  • 05-面向对象语法-多态

    多态(父类指针指向子类对象)1.代码体现:父类类型的指针指向子类对象; 2.好处:如果函数、方法形参中使用的是父类...

  • 面向对象

    Java 语法基础 面向对象 ==面向对象有三宝:封装、继承和多态== 继承 关键字:extends 和 impl...

  • iOS开发初学者学习路线

    基础C语言基本语法、Objective-C基本语法面向对象特性(类、对象、继承、多态、动态类型、动态绑定)协议(P...

  • 05-面向对象语法-继承

    1.继承的好处 2.继承的坏处 3.继承注意点 4.继承的使用场合 代码一: 代码二: 代码三: 原文:http:...

  • 05-面向对象语法04

    一、继承 1.继承的基本用法 设计两个类Bird、Dog 有相同的属性和行为,抽出一个父类Animal(先抽取we...

  • 2019-07-23

    java 基础 基础语法: 1-2天 编程思想: 面向对象 封装,继承,多态 高级应用 : 线程;IO; 网络 J...

  • js跳出循环:break 、continue 、return

    跟许多多态语言一样,js也有break,continue,return 面向对象编程语法中我们会碰到break ,...

  • Java基础day08笔记:多态|多态中成员的特点|多态的应用示

    01-面向对象(多态-概念) 接下来说一下面向对象的第三个特征:多态。 何为多态呢? 其实...

  • 宅男知识大补丸 学多态 认包包

    java零基础入门-面向对象篇(十) 多态 面向对象的三大特征,封装,继承我们讲完了,这次来讲多态。 多态就是指一...

  • OC面向对象—多态

    OC面向对象—多态 OC面向对象—多态 一、基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没...

网友评论

      本文标题:05-面向对象语法-多态

      本文链接:https://www.haomeiwen.com/subject/jgxesxtx.html