Objective-C 里面的类对象复用小结

OC 提供了单继承 (Inheritance), Category, Extension, Protocol 这几种基本的类与对象层面的复用机制,作一小结。

在这几个机制中,继承提供了纵向的复用,可以扩展属性变量和方法,而 Category 只可以扩展方法,Extension 仅在拥有源代码的情况下可以使用,可扩展属性变量和方法,而 Protocol 则是仅仅提供抽象接口,类似于 C++ 中的抽象类模版。深入一点,继承的时候类实例的内存布局也同时被继承下来,而且这个布局是在编译时就决定了,在运行时不能改变,但是方法是保存在类的全局对象中的,可以在运行时 增加类的方法,这就是 Category(这个和JS里面的原型链比较相似)。因为OC里面的@implementaion ... @end 块隐含了类的构造方法和析构方法,以及属性变量的定义等,所以,OC的一个类的方法是要在一个源文件里面定义完毕的,不能像C/C++那样分散到不同的源文件进行编译,但是 Category 的@implementation ... @end 块是不隐含类的构造方法和析构方法的,这样,我们就可以在一个类上面创建多个Category,而且一个 Category 的定义(实现)可以分布在不同的源文件中,这就提供了一种构造大而复杂的类的方法(虽然不一定大家都喜欢)。Extension 的本质是匿名Category,它只有声明,而且可以多次声明,定义(实现)是在类的源文件里面进行的,在编译的时候同时也要编译类的源文件,同时在 Extension 的头文件中可以添加属性变量,这些变量只能在类的实现源文件中使用,否则编译器报错,所以,一般用来作为隐藏私有变量来使用。当某些类具有某个方面的共同操作时,这些共同操作可以抽象出 Protocol,可以理解为操作上的类 属,因为是抽象的,只有声明,没有定义或者实现,同时因为是类属,所以,一个类可以实现多个 Protocol 。OC 程序可以指定某个Protocol 的类型,比如 id<some_protocol> ,这个和C++里面的抽象类模板有点相似,最新版的LLVM也已经支持OC的范型编程了。

简而言之,继承提供了类型的数据与方法的复用,Category 提供了增加类型方法的途径,属于类型的增强,Extension 则提供了类型的私有数据的途径,Protocol 则是提供了类型的类属合约,不过它并不能生成类型。如果要使用类型生成,则可以使用Objective-C++中的模版。

 

 

posted @ 2015-05-27 07:55  Mr.Coder  阅读(213)  评论(0编辑  收藏  举报