Objective-C 对象,实例和方法

什么是对象?

对象就是一个事物。在 Objective-C 中,把面向对象的程序设计看成是一个事物,而且我们想对这个事物做些工作。这就与过程性语言C语言迥然不同了。在C语言中,通常是先考虑要做什么,然后才关注对象。所以二者之间的思维模式几乎是完全相反的过程。

Mike 在这里唠叨一句,其实面向对象这个来自大陆的翻译,个人觉得不太到位。更喜欢台湾的说法:物件导向。一语中的!对象这个词过度抽象,让很多刚刚入门的新人很难一下深明其意。

在《Objective-C 2.0 程序设计》一书中,举了一个生动形象的日常生活中的例子来进一步说明这个抽象的概念。

假定你有一辆汽车,显然它是一个对象,而且是你有拥有的。你并不是拥有任意一辆汽车,而是一个特定的Car,它是由一家制造厂制造。你的汽车拥有一个车辆识别号码,它唯一标识你的车。

在面向对象的用语中,你的汽车是汽车的一个实例。如果继续使用术语的话,car 就是的名称。这个实例就是从该类创建的。因此,每制造一辆新汽车,就会创建汽车类的一个新实例,而且汽车的每个实例都称作一个对象。

你的汽车可能有各种各样的特性,银白色的或者是黑色的,敞篷的或者是金属顶盖的,等等。除此之外,你还可以对你的汽车进行各种各样的操作。例如驾驶,加油,洗车,维修,等等。上面所列这些操作可以对你的汽车实现,也其他车实现。例如,你的姐姐会驾驶她自己的汽车,加油,洗车,维修。

看过上面的内容,接下来,我们就可以引申出实例和方法的概念了。类的独特存在就是一个实例,对实例执行的操作名为方法。在某些情况下,方法可以应用于类的实例或者类本身。例如,可将洗车作为一个实例,它就是个实例方法。但如果把“找出一个家制造厂制造了多少款汽车”应用于这个类,那么它将是一个类方法

假设你有两辆使用装配线制作的汽车,看上去它们一模一样。但由于每辆车都由不同的驾驶员驾驶,这就使它们自身获得了独一无二的特性。不过这些特性并不一成不变,一般情况下是处于动态改变的状态。当行驶汽车时,油箱的油逐渐耗尽,汽车越来越脏,轮胎逐渐磨损。

对对象使用方法可以影响对象的状态。如果方法是“给汽车加油”,执行这个方法之后,汽车的油箱将会加满。这个方法影响了汽车油箱的状态。

这就引出了一个非常关键的概念。对象是类的独特表示,每个对象都包含一些通常对该对象来说是私有的信息(数据)。方法提供访问和改变这些数据的手段。

Objective-C 采用特定的语法格式对类和实例使用方法。[ClassOrInstance method]; 在这条语句中,左方括号后要紧跟类的名称或者该类的实例的名称,它后面可以是一个或多个空格,空格后是要执行的方法。最后,使用右方括号和结束分号来终止。请求一个类或实例来执行某个操作时,就是向它发送一个消息,消息的接受者称为接收者。因此,右另外一种方式可以表示前面所描述的一般格式。[receiver message];

我们继续用汽车举例,你需要获得一辆新车,取制造厂购买一辆新车 yourCar = [Car new]; 向Car类(消息的接收者)发送一条消息请求它卖给你一辆新车。得到的对象(它代表你的独特汽车)将被存储到变量 yourCar 中去。从现在开始,可用 yourCar 引用你的汽车实例,就是你从制造厂买的那辆汽车。

因为你在制造厂购买了一辆新汽车,所以这个新方法可以叫做制造厂方法,或者类方法。对新车执行的其余操作都将是实例方法,因为它们应用于你的新车。下面是一些可能的实例方法:

[yourCar drive]; 驾驶

[yourCar wash]; 洗车

[yourCar getGas]; 加油

currentMileage = [yourCar currentOdometer];

最后一个示例显示的实例方法可返回信息,即当前的行驶里程,这通过里程表 (Odometer) 来反映出来。我们同时将该信息存储在程序中的 currentMileage 变量内。