黑马程序员——OC基础——面向对象的三大特性(三)
2014-12-11 21:39
477 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
三:多态
基本概念:多态在代码中的体现是父类指针指向子类对象
多态即为多种形态,必须要有继承,否则就没有多态
在使用多态时会进行检测以调用真实的对象方法
例如:声明一个Animal类
代码分析
OC语言是一门弱语法的语言,编译的时候并不会报错,编写代码时要避免这样的错误
多态的好处:
需要一个新的函数来专门喂狗
在上面的例子中只需要把函数的参数写成Animal *类型,那么Dog和Cat类型的对象就可以传入进来
调用的时候直接改变参数即可。
多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。
不建议的做法:
解决办法:可以将a强制转换为Dog *类型的变量
多态的使用总结:
1,没有继承就没有多态
2,父类类型的指针指向子类对象
3,优点:如果函数方法参数中使用的是父类类型,测可以传入父类和子类对象,而不用再去定义多个函数来和相应的类型进行匹配
4,局限性:父类类型的变量不能直接调用子类特有的方法,如果必须调用,则必须强制转换为子类特有的方法
三:多态
基本概念:多态在代码中的体现是父类指针指向子类对象
多态即为多种形态,必须要有继承,否则就没有多态
在使用多态时会进行检测以调用真实的对象方法
例如:声明一个Animal类
#import <Foundation/Foundation.h> //声明一个animal类,继承自NSObject @interface Animal : NSObject //animal类中声明一个eat对象方法 - (void)eat; @endAnimal的实现:
@implementation Animal //eat的实现 - (void)eat { NSLog("动物吃东西"); } @end在创建一个Dog类:
@interface Dog :Animal //Dog类继承自Animal类,拥有了Animal类中的属性和方法 //在子类中声明了父类中已有的方法 - (void)eat; @endDog类的实现:
@implementation Dog //实现eat方法 - (void)eat { NSLog("狗吃东西"); } @end运行程序:
int main() { //Dog类型的指针指向Dog类型的对象 Dog *d = [Dog new]; //Dog类对象调用对象方法 [d eat]; //多态 //父类指针指向子类对象 Animal *a = [Dog new]; //此时a指向的是Animal类型而不是Dog类型 //Animal类型的指针指向Animal类型的对象 Animal *a1 = [Animal new]; [a1 eat]; //以下是多态的一些体现 NSObject *n = [Dot new];//[n eat]; //因为OC是弱语法,所以OC编译器不会报错,只会警告,程序运行会崩溃 NSObject *n1 = [Animal new]; return 0; }程序运行结果:
狗吃东西 狗吃东西 动物吃东西使用注意:
代码分析
Dog *d = [Animal new];动物是一条狗,从语义上说不正确,但是程序可以编译
NSString *str = [Dog new];狗是一个字符串,同样
OC语言是一门弱语法的语言,编译的时候并不会报错,编写代码时要避免这样的错误
多态的好处:
需要一个新的函数来专门喂狗
void feed(Dog *d) { [d eat]; }如果这个时候也需要喂猫,就需要再写一个新函数
void feed(Cat *c) { [c eat]; }猫和狗都继承自动物这个类,这样就可以简写一些代码
在上面的例子中只需要把函数的参数写成Animal *类型,那么Dog和Cat类型的对象就可以传入进来
调用的时候直接改变参数即可。
多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。
不建议的做法:
Animal *a = [Dog new]; [a run];在Animal类中没有run方法,这里调用了狗对象的方法
解决办法:可以将a强制转换为Dog *类型的变量
Dog *d = (Dog *)a;使用强制转换,这里a和d指向的是同一个狗对象
多态的使用总结:
1,没有继承就没有多态
2,父类类型的指针指向子类对象
3,优点:如果函数方法参数中使用的是父类类型,测可以传入父类和子类对象,而不用再去定义多个函数来和相应的类型进行匹配
4,局限性:父类类型的变量不能直接调用子类特有的方法,如果必须调用,则必须强制转换为子类特有的方法
相关文章推荐
- 黑马程序员——OC语言基础——面向对象三大特性之封装
- 黑马程序员——OC语言基础——面向对象三大特性之多态
- 黑马程序员——OC语言基础:面向对象三大特性,封装、继承、多态
- 黑马程序员—OC语言基础—面向对象的三大特性(2)
- 黑马程序员——OC语言基础——面向对象三大特性之继承
- 黑马程序员—OC语言基础—面向对象的三大特性(1)
- 黑马程序员——OC基础——面向对象的三大特性(一)
- 黑马程序员——OC基础---面向对象(思想,类,对象,三大特性)
- 黑马程序员_OC基础04_面向对象三大特性
- 黑马程序员——OC面向对象三大特性——封装,继承,多态。
- 黑马程序员————IOS学习笔记 第4篇 OC面向对象三大特性(2)
- 黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)
- 黑马程序员————OC面向对象_三大特性之封装
- 黑马程序员-OC之面向对象的三大特性:封装、继承和多态
- 黑马程序员————OC面向对象_三大特性之继承与多态
- 黑马程序员--------OC面向对象的三大特性
- 黑马程序员——OC—面向对象的三大特性
- 黑马程序员——【OC】面向对象的三大特性
- 黑马程序员_OC面向对象的三大特性之封装及OC中类方法和self的使用
- 黑马程序员-09.OC面向对象的三大特性和开发技巧