您的位置:首页 > 职场人生

黑马程序员——OC基础——面向对象的三大特性(三)

2014-12-11 21:39 477 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

三:多态

基本概念:多态在代码中的体现是父类指针指向子类对象

    多态即为多种形态,必须要有继承,否则就没有多态

    在使用多态时会进行检测以调用真实的对象方法

例如:声明一个Animal类

#import <Foundation/Foundation.h>
//声明一个animal类,继承自NSObject
@interface Animal : NSObject
//animal类中声明一个eat对象方法
- (void)eat;
@end
Animal的实现:
@implementation Animal
//eat的实现
- (void)eat
{
NSLog("动物吃东西");
}
@end
在创建一个Dog类:
@interface Dog :Animal
//Dog类继承自Animal类,拥有了Animal类中的属性和方法
//在子类中声明了父类中已有的方法
- (void)eat;
@end
Dog类的实现:
@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,局限性:父类类型的变量不能直接调用子类特有的方法,如果必须调用,则必须强制转换为子类特有的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息