ios类别

类别

  Objective-C向面向对象编程中添加了一个新概念:类别(categor)。类别被设计用于解决这样的问题:基类被认为是很脆弱的,即便是看似无害的改动也不能引入,否则可能会破坏更复杂的派生类。当程序增长达到一定的规模时,开发者常常会变得不敢触碰一个很小的基类,因为难以决定哪些改动是安全的,除非审查整个应用程序。类别提供了一种机制,可以在较小的基类中添加功能,而又不会将你的改动暴露给遗留代码。

  你可以将一个类别置于一个较小的类之上,在基类之中添加或替换方法。这些行为不用重新编译原来的基类就可以完成,甚至不需要访问基类的源代码。类别让你可以将对基类的扩展限制在一定范围内,从而令任何使用该基类(而不是类别)的对象都可以继续采用原始版本。从开发者的角度看来,这使得对一个由别的开发者编写的类进行改进变得容易多了。在运行时,使用类别这部分代码会看到类的新版本,而直接使用基类的遗留代码则只会看到原始版本。

  你可能会觉得,继承同样可以解决这个问题。继承与类别之间的区别,就像是对你的车进行性能调试与将其装饰成游行花车之间的区别。当你调整跑车之时,你会在车辆的内部添加新的零件,令其性能得到提升。你甚至会剔除某些部分,代之以新零件。对引擎添加一个新零件,比如涡轮增压,会影响到整个车辆的功能。这就是继承的工作方式。

  类别则更像是一个游行花车的装饰,车辆本身根本没有什么变动,仅仅是在车辆外部粘上硬纸片和纸浆糊做成的各种造型,看起来不一样了。在游行的过程中,这部车对于旁观者是完全不同的东西,但当你把它交给修理工之后,它就又变回了那辆你到处开来开去的老爷车。

  例如,零件工厂要出产一种新型零件,可以飞越宇宙空间,但是又担心如果对基类进行修改的话,可能会破坏现有的应用程序。通过构建一个类别,开发者可以保证使用基类MyWidget的应用程序将继续看到原来的类,而新的太空应用程序则将使用一个类别。下面的例子在现有的MyWidget基类之上,构建了一个名为MySpaceWidget的新类别。由于我们需要在太空中炸毁目标的能力,所以里面添加了一个名为selfDestruct的方法。这个类别还用自己的版本替换了原有的powerOn方法。与例1-1对比一下,你会发现这里我们是用括号包围了MySpaceWidget类,而例1-1中则是用冒号进行继承:
  
  1. #import "MyWidget.h"
  2.   @interface MyWidget (MySpaceWidget)
  3.   - (void)selfDestruct;
  4.   - (BOOL)powerOn;
  5.   @end
复制代码

  一个完整的实现了这个类别的源文件如例 1-3所示。
  例1-3 类别示例(MySpaceWidget.m)
  
  1. #import "MySpaceWidget.h"
  2.   @implementation MyWidget (MySpaceWidget)
  3.   - (void)selfDestruct {
  4.   isPoweredOn = 0;
  5.   speed = 1000.0;
  6.   mass = 0;
  7.   } -
  8.   (BOOL)powerOn {
  9.   if (speed == 0) {
  10.   isPoweredOn = YES;
  11.   return YES;
  12.   } /
  13.   * 如果宇宙飞船在移动就不要启动
  14.   */ return NO;
  15.   }
  16.    @end
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值