当前位置:首页 > Ios > Objective-C多态学习

Objective-C多态学习

在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。

苹果开发

有这样一个例子.早上我和同事说口渴了.结果:A同事拿着我的水杯去给我接了一杯水.B同事顺手在饮水机上拿了一次性纸杯给我接了杯水。C同事给了我一瓶他早上刚买的饮料。同事们得到的是同样的请求,但是三个人都有各自的解决办法,这就是多态。

  在面向对象的程序设计理论中,多态(polymer phism)指的是,同一操作作用于不同类的实例时,将产生不同的执行效果.即不同类的对象收到相同的消息时,也能得到不同的结果.

  我们知道,OC是一门动态语言,在使用多态时,系统会进行动态检测,以调用真实的对象方法. 在具有继承关系的前提下,多态在代码中体现为父类指针指向子类对象.

  实现:

  首先创建一个Animal类,让其继承自NSObject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Animal.h
@interface Animal : NSObject
 
// 声明动物吃东西的方法
- (void)eat;
@end
 
 
 Animal.m
@implementation Animal 
- (void)eat { 
 
NSLog(@"动物吃东西"); 
} @end

再创建一个一个Cat类和Dog类,分别重写自己独有的方法.

  Cat 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cat.h
 
// Cat继承自Animal类
@interface Cat : Animal
 
@end
 
 
Cat.m
@implementation Cat 
 
// 重写猫独有的方法
- (void)eat { 
NSLog(@"猫吃鱼"); 
 
} @end

Dog类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dog.h
 
// Dog继承自Animal类,拥有了Animal所有的属性和方法
@interface Dog : Animal
 
@end
 
Dog.m
@implementation Dog
 
 
// 重写狗独有的方法
- (void)eat { 
 NSLog(@"狗吃骨头"); 
} @end

回到main中实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 创建animal对象
    Animal *animal = [[Animal alloc] init];
 
    // 多态的实现:
    //1. 父类指针指向子类对象
    animal = [[Cat alloc] init];
 
    // 此时调用的方法到底是 动物吃东西呢? 还是猫吃东西呢?
    [animal eat];
 
   //2.
    animal = [[Dog alloc] init];
    [animal eat];

打印:

2015-11-27 17:31:38.975 DuoTai[1597:251835] 猫吃鱼

2015-11-27 17:31:38.975 DuoTai[1597:251835] 狗吃骨头

苹果开发

  下面,我们再来看这样两行代码:

Dog *dog = [[Animal alloc] init]; // 动物是一条狗?这样的逻辑正确吗??

NSString *string = [[Dog alloc] init]; // 狗是一个字符串??

由上面发现:

  OC语言是一门弱语法的语言,编译的时候并不会报错,系统只会发出警告.所以这就要求我们在实际的开发过程中一定要按照既定的规范来写代码。

多态的优点

  猫和狗都是继承自Animal这个类,在这里我们就可以使用多态来简化代码了,只需要把函数的参数写成Animal * 类型的,那么Dog 和Cat类型的对象就可以传进来了,在调用的时候直接改变参数就可以了.

  • << 关于SQL Server中数据存储的那些事
  • JavaScript设计模式 - 策略模式 >>
  • 作者:
    除非注明,本文原创:知道91,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.zhidao91.com/objective-c/

    相关文章 近期热评 最新文章

    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • ABP开发指南系列教程(2) – 多层架构...
      为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: 展现层(...
    • ABP开发指南系列教程(1) – 入...
      ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WE...
    • Windows下 JIRA + Agile + Mysql 破解...
      本文讲述了Windows下 JIRA + Agile + Mysql 破解安装示例教程
    • c#类的构造函数继承关系示例剖析
      本文通过示例代码讲解了c#子类的构造函数与父类的关系,子类怎样集成父类的构造函数的。