Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

4.7 分类

当我们的机器人士兵刚刚投入战斗时,发生了一件很不愉快的事情,敌人将机器人士兵捕获后重写程序,并用于突袭自己人,造成了一些不必要的损失。现在,不可能将战斗中的所有机器人都返回工厂修改程序了。所以,就制造了一个小小的辅助装置,就像外挂一样,我们将它称为分类(category),使用分类可以不修改原类,也不使用继承,而扩展原有类的功能。

现在,我们在机器人士兵上使用的分类就是一个自毁(self-destruct)装置。

■4.7.1 命名分类

如果我们要创建一个类的命名分类,需要创建一组新的头文件和模块文件,而它们的命名,常用的方式是“主类名+分类名”。如我们创建CRobotSoldier的自爆功能分类,可以使用CRobotSoldierSelfDestruct作为文件名,下面就是分类的头文件部分(CRobotSoldierSelfDestruct.h文件)。

    #ifndef __CRobotSoldierSelfDestruct_h__
    #define __CRobotSoldierSelfDestruct_h__
    #import <Foundation/Foundation.h>
    #import "CRobotSoldier.h"
    @interface CRobotSolder(SelfDestruct)
    -(void) selfDestruct;
    @end
    #endif

声明命名分类时,我们在主类的后面使用一对圆括号指定分类名称。接下来,需要在相应的分类模块文件中实现分类中的成员(CRobotSoldierSelfDestruct.m文件)。

    #import "CRobotSoldierSelfDestruct.h"
    @implementation CRobotSolder(SelfDestruct)
    -(void) selfDestruct
    {
        NSLog(@"启动自爆装置");
    }
    @end

然后,我们可以通过下面的代码使用分类中的新成员。

    #import <Foundation/Foundation.h>
    #import "CRobotSoldierSelfDestruct.h"
    int main(int argc, char *argv[])
    {
        @autorealeasepool {
            CRobotSoldier *killer = [[CRobotSoldier alloc] init];
            [killer selfDestruct];
        }
        return 0;
    }

请注意,在使用分类时,我们引用的是分类的头文件,而对象定义的是主类(如CRobotSoldier)的对象。

此外,在分类中也可以定义与主类中同名的成员,但这样一来,分类中的成员就会完全覆盖主类中的成员,而且主类中的成员再无法访问。除非你的目的就是这样,否则需要小心使用。

■4.7.2 匿名分类

在创建分类时,我们还可以不指定分类名称,此时,分类接口部分只需要在主类名称后跟着空的一对圆括号()即可。不过,应注意匿名分类的实现部分,必须放在主类的实现代码文件中,也就是说,要和主类的实现代码在一起。

所以说,使用匿名分类的前提是,你可以修改主类的源代码。