美文网首页
组合和继承的使用区别

组合和继承的使用区别

作者: 李华光 | 来源:发表于2017-01-12 15:37 被阅读0次

前言

在面试时经常会被问到,什么是category,什么是继承,二者有什么区别,重写一个类是继承好还是分类号,为什么?

比较

  1. Category是一种为现有类扩展新的方法,而不需要继承或者改变现有类的方式。
  2. 继承是面向对象语言都有的一个特性,子类会继承父类的方法和属性。

如果新扩展的方法与原方法同名就不要使用category,因为系统有很多方法是用Category实现的,重写之后,会导致在Runtime的时候,只有一个方法会被执行,而哪个会被执行是undefined。

这样会导致所有引用了这个分类的方法都会遭到篡改,无法调用到原来的方法,而继承可以使用重写父类方法,并不会影响其他类的使用。

举个例子吧,我们通过分类扩展UIColor。

头文件

#import <UIKit/UIKit.h>

@interface UIColor (Extension)

+ (UIColor *)whiteColor;

+ (UIColor *)Ex_whiteColor;

@end

实现文件

#import "UIColor+Extension.h"

@implementation UIColor (Extension)

+ (UIColor *)whiteColor {
    return [UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue: 0.0/255.0 alpha:1.0];
}

+ (UIColor *)Ex_whiteColor {
    return [UIColor colorWithRed:0.0/255.0 green: 0.0/255.0 blue:0.0/255.0 alpha:1.0];
}

@end

[UIColor whiteColor];是系统框架UIKit提供的类方法,假设我们通过分类扩展重写了+ (UIColor *)whiteColor;方法,而且恰好#import "UIColor+Extension.h"在预编译时就被引用了,那么所有调用[UIColor whiteColor]设置颜色都会变成黑色而不是白色,这将会是一种灾难。

当然我们可以通过扩展新方法+ (UIColor *)Ex_whiteColor;来达到这个目的,只要引入#import "UIColor+Extension.h",就可以调用+ (UIColor *)Ex_whiteColor;

Category的使用场景

  1. 当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
  2. 一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现
  3. 当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。

遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有些问题需要注意:

  1. Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
  2. Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。
  3. 和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。

总结

  1. 如果要重写现有类的方法,请考虑使用继承。
  1. 如果给现有类扩展属性,考虑使用继承(虽然category也可以通过runtime添加属性,建议使用继承)。
  2. 针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,考虑使用类别来进行方法扩展。
  3. 对于开发人员针对自己构建的类,对于大型而复杂的类,建议使用类别,这有助于提高可维护性。

参考

相关文章

  • 【python面试指北】3.类和面向对象

    面向对象编程 封装、继承、多态 组合与继承 优先使用组合(has a)而非继承(is a) 类变量和实例变量的区别...

  • 组合和继承的使用区别

    前言 在面试时经常会被问到,什么是category,什么是继承,二者有什么区别,重写一个类是继承好还是分类号,为什...

  • 继承、组合、聚合

    继承和组合的区别 继承是 is A,组合是has A。 车有轮子、引擎、轴承。 车不能继承轮子、引擎、轴承,因为车...

  • 继承和组合的区别

    学习装饰者模式时遇到了组合的使用

  • 组合模式(Composite)

    在探讨Java组合模式之前,先要明白几个概念的区别:继承、组合和聚合。 继承是is-a的关系。组合和聚合有点像,有...

  • JavaScript进阶:组合式继承和寄生组合式继承

    1、组合式继承 组合继承了使用原型链实现对原型属性和方法的继承,同时配合使用构造函数继承实现对实例属性的继承。以免...

  • js实现继承的几种方式

    js实现继承有几种方式,这里我们主要探讨 原型链继承 构造继承 组合继承(原型链和构造继承组合到一块,使用原型链实...

  • javascript继承之组合继承(三)

    组合继承也叫伪经典继承,也就是组合了原型链和借用构造函数实现思想:使用原型链实现对原型属性和方法的继承,通过借用构...

  • java5大原则叫你学会面向对象设计

    1、优先使用组合而非继承 如果可以的话,要优先使用组合而非继承。你们中的一些人可能为此争论,但我发现组合比继承更有...

  • 学习笔记-为何说多用组合少用继承

    在面向对象的编程中,有一条非常经典的设计原则:组合优于继承,多用组合少用继承。什么不推荐使用继承?组合比继承有哪些...

网友评论

      本文标题:组合和继承的使用区别

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