欢迎回到Objective-C介绍的第二部分。上周我们了解了C语言的一些基础知识,Objective-C是基于C语言的。这周我们将会介绍是什么使得Objective-C成为了如此了不起的语言。我们还将介绍在Objectitve-C中如何进行面向对象语言编程(OOP)和说明如何声明一个类和给类发消息。
面向对象编程
为什么有了Objective-C语言呢?为什么我们不使用底层的C语言?是因为Objective-C中使用了面向对象的概念。OOP是一种编程思想,它允许开发者在软件设计中使用对象和属性的概念,而不是直接使用变量和函数。更重要的是OOP允许数据的抽象、封装、模块化、多态和继承。关于OOP的话题可以单独成书,所以这里只是通过例子简单的介绍一下基本概念。
假设你有一辆车。你可以将它想象成一个对象。世界上还有很多车,你也许不只有一辆车。在面向对象中,我们将车这一概念抽象为一个类,而将车的实体称之为实例。当一辆新的车被制造出来,一个新的车实例被实例化,然后被赋给自己特有的属性。
还是有点不明白?另外一个例子是点心和点心切割刀。点心切割刀是类,点心是对象。
为什么我们要考虑对象?因为人的大脑会将真实世界概念化,所以将计算机开发抽象化会很方便。
类(也就是对象)由方法和属性构成。如果你有其他语言编程经验,你会发现方法和函数、熟悉和变量有很多共同点。
方法
我们已经有了一个车的实例,接下来要怎么做呢?我们可以开这辆汽车,也可以为它加油等等。这些行为只能在我们自己的汽车上进行,也就是说,我们只能影响一个实例,而不是所有的汽车。因此,一个关于汽车实例方法被称作实例方法。实例方法只针对于实例。
另外一方面,如果我们想知道汽车一共有多少种颜色,这个就是一个类方法。因为我们不用考虑类的实例而是类自身的属性。
你会越来越熟悉这些原则,让我们来看看一些语法。
在Objective-C中,我们通过消息传递来调用类方法。当我们知道油箱里有多少油时,我们向实例发送一个需要加多少油的消息。就像下面这样:
[recipient message];
括号表示我们在发送消息。第一个参数是消息接受者,第二个参数是消息本身。最后,不要忘记了加上分号。
根据上面的例子,我们可以给一辆坦克加油:
[dansCar addGas];
上面的例子说明了我们向一个汽车实例“dansCar发送了一条“addGas”的消息。这和调用方法是一致的,在其它语言中,它可能是这样的:
dansCar.addGas();
属性
假设我们的汽车类中一辆坦克的油箱,如果它含有50%的油,那么它是半满的,如果它含有100%的油,意味着它是全满的。现在,如果我们想知道油罐车里有多少油,我们不应该直接获取它的属性,而是利用一个返回属性值的函数。相同的,如果我们向坦克加油,我们不直接修改熟悉的值,而是使用一个setter函数来修改这个属性的值。这个过程被称为数据封装。
数据封装指的是将数据放在方法里,也就是需要通过方法来访问数据。如果你有开发经验但没有听说过封装,你可能会想这么做的原因。因为封装为类的开发者和类的使用者中间提供了一层保护。因为类方法是在类中操作的,它保证了数据的完整性。另外一个好处是,当开发者发布类时,类的使用者不用关心类的内部。当开发者因为效率等原因更新类内部的代码时,用户不用更改任何代码。
下面我们来介绍Objective- C是如何区分接口和实现的。
接口和实现
当你生成一个Objective-C类时,你会发现有两个文件,一个是以.m结尾的实现文件,另一个是以.h结尾的接口文件。
接口
#import
@interface Car : NSObject {
//This is where attributes go
float fillLevel;
}
//This is where methods go
- (void)addGas;
@end
首先,我们导入Cocoa.h,这是标准库。
其次,我们为Car声明了一个接口。并且声明它是继承NSObject类的。后面还会深入介绍。
再次声明了一个fillLevel变量,类型是float,用于表示百分比。
最后,声明了一个addGas方法。-表示这是一个实例方法,而不是类方法。(void)部分表示这个方法不会返回任何值。如果这个方法将会返回一个整型,可以换成(int)。我们以分号结束方法声明。
实现
#import "Car.h"
@implementation Car
-(void) addGas {
// code goes here to add gas
}
@end
实现包括了向坦克家汽油的方法。我们引入了Car.h这个接口文件。在addGas的地方,还可以添加其他的方法,但今天不做过多介绍。
下次
下载我们将会更深入的介绍方法和在方法中使用变量(包括在Objective-C中使用变量的基本方法)。有些新的开发者会对生成了两个文件感到困惑。如果你有这种感觉请重新阅读上面的部分或者在下面给我留言。类会在后面的部分不断出现,它是非常重要的部分。