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

4.1 面向对象编程基础

现在,我们将打造机器人队伍,而且是要求模块化设计,这样才能更有效地生产、维护与扩展。

第一个问题,我们需要机器人,它应该是什么类型的呢?Robot类型,怎么样?实际上,我们还没有这个类型,那就先假装有好了!现在,我们需要一个机器人变量,如下面的代码。

    Robot robot5;

接下来,让机器人robot5走两步看看,对于动作处理,到现在为止只能使用函数,如下面的代码。

    robotMove(robot5, 2);

发现敌人要攻击,如下面的代码。

    robotAttack(robot5, target);

现在,大家还有兴趣继续玩下去吗?不如,我们换一种方式玩吧。首先,还是假设有Robot类型和一个robot5变量,如果能使用下面的代码来完成移动、攻击等操作是不是更直观呢?

    Robot *robot5;  // 为什么要加*,这可不是为了装,稍后道来
    robot5.name = @"No.5";  // 机器人5号,5号活了
    [robot5 move:2];  // 走两步
    [robot5 attack:target];  // 射击目标

这就是面向对象编程的基本形式,我们将一个事物的特性(属性)和动作(方法)进行封装,从而能够更加直观地编写代码,同时,也会使代码更具有逻辑性、可读性和可维护性。

接下来,我们就先来了解一些面向对象编程的基本概念,稍后讨论如何在Objective-C项目中实现面向对象编程。

1.类与对象

在面向对象编程概念中,可以将“类(class)”看作复杂的数据类型。

有了数据类型,我们就可以创建这个类型的变量,而类这个类型的变量就是对象(object),或者称为类的实例(instance)。当然,我们创建对象的过程并不会像操作基本数据类型变量那么简单,在这一过程中,往往需要更多的内存分配、数据初始化、资源调用等操作,这些操作都会在创建对象过程中完成,而这个过程,我们又可以称为类的实例化过程。

假如我们定义了机器人类型CRobot类,我们可以创建一个具体的机器人对象,如“5号”机器人robot5,那么,robot5就是CRobot类的一个实例,或者说是CRobot类型的对象。

请注意,在类这个类型前加一个大写的字母C是我的编程习惯,而你可以在一定的范围内根据自己的习惯,或者是项目约定来创建类的名称。

2.属性与方法(任务)

对象的特性,如速度、颜色、名称、位置等,可以通过属性来表示,如robot5. name=@“No.5”,其中,name属性就表示机器人的名称。

对象的动作,如攻击、移动等,我们就可以定义为方法来实现,如[robot5 attack]。请注意,方法(method)是面向对象编程中的术语,而Apple官方文档称为任务(task),本书中,我们会使用习惯性的面向对象编程术语,即方法(method)。在Objective-C中,它的定义方式和函数还是很大区别的,稍后我们就会看到。

3.继承

前面我们提到过,一个对象的创建需要比较复杂的内存分配等初始化操作,如果每一个类的全部操作都需要我们编写代码来实现,那可不是闹着玩的,特别是需要动手管理内存这活儿,真的是要非常小心。

还好,我们并不需要一切从零开始。

在Foundation框架中定义了NSObject类,而我们定义的类,如果没有特殊要求,都可以继承NSObject类型。这样,在新的类中就可以使用NSObject类中定义的成员,如属性和方法,从而简化了类的创建工作。

从另一方面来看,在创建复杂的应用程序时,我们可以利用已经存在的类,包括Foundation资源、其他Apple或第三方提供的资源,当然还包括自定义资源,这可以帮助我们进一步提高开发效率。

比如,我们创建了一个汽车类CAuto,一些衍生车型就可以继承它的基本特点和功能,如CCar、CSuv等。此时,CAuto类就是CCar和CSuv的基类(又称为父类或超类),而CCar和CSuv就是CAuto的子类。

在Objective-C项目中,NSObject类是唯一没有基类的类,而其他的类都必须指定一个基类。

了解面向对象编程的一些基本概念以后,我们就来看看如何在Objective-C中实现它们。