分类(Category)和继承(Inherit)的区别

继承(Inherit)

  • 好处:
    • 可以抽取重复代码;
    • 建立类之间的关系;
    • 子类可以拥有父类的方法和属性;
A{
  int _age
  int _name
  }

B{
  int _age
  int _name
  int _weight
 }

B : A{
 int _weight
 }
  • 注意点:

    • 不可以和父类有相同的属性;
    • 可以和父类有相同的方法;
    • 父类必须声明在子类前面
    • 调用某个方法,优先在当前对象中找,如果找不到该方法,去父类中找
  • 坏处:

    • 耦合性太强
  • 解决方案:
    • 分类 + 组合
A{
  int _age;
  int _name;
  }

B{
  // int _age;
  // int _name;
  A *a;
  int _weight;
 }

分类(Category)

  • 好处:

    • 在不改变原来的内容的基础上,可以增加一些方法;
  • 注意点:

    • 只能添加方法,不能添加属性;

    • 分类的方法中可以访问原来的成员变量;

    • 分类中可以重写原来的方法,但是会覆盖原来的方法,会导致原来的方法没办法再使用(方法优先调用步骤:本对象-->原来的类--->父类),同样是分类的话,要看哪个是最后编译的

      分类(Category)和继承(Inherit)的区别_第1张图片
      aceae75f-6cc3-4cf5-b56c-0f202bda3579.jpg
  • 分类也可以写在类里面(大部分写在外面)

    • 比如
    // >>>>>.h
     #import 
    @interface Cat : NSObject
    
    @end
    
    @interface Cat (Add)
    - (void)addTest;
    @end
    
    // >>>>>>.m
    #import "Cat.h"
    @implementation Cat
    
    @end
    
    @implementation Cat(Add)
    - (void)addTest
    {
    NSLog(@"分类中增加的方法");
    }
    @end
    

区别

  • 1.继承Inherit
    • 这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。
      对于以下情况,无法使用类别,必须使用继承。
      • 1)新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。
      • 2)扩展类的属性,这个类别无法做到。
  • 2.类别category
    • 这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。
      以下两种方式最好使用类别。
      • 1)针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最好使用类别来进行方法扩展。
      • 2)类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

你可能感兴趣的:(分类(Category)和继承(Inherit)的区别)