继承和复合,是类与类之间两种重要的关系。接下来,我们就借用书本上的例子来介绍下复合关系。
假如我们要构建一个简单的汽车模型,那么要有一个发动机(Engine)和四个轮子(Tire)。基本定义的代码如下:
首先,先定义和简单的实现Tire类。
<span style="font-size:12px;">@interface Tire : NSObject
@end //Tire
@implementation Tire
-(NSString *) description{
return (@"I am a tire. I last a while.");
}
@end</span>
在实现方法中的description没有定义,那么他是哪里来的呢?在Cocoa中,NSLog()可以使用%@格式说明符来输出对象,NSLog()将对象发送了description消息,然后对象的description方法生成一个NSString并将其返回。所以,在类中提供description方法,就可以自定义NSLog()。
然后定义和简单的实现Engine类。
<span style="font-size:12px;"> @interface Engine : NSObject
@end
@implementation Engine
-(NSString *) description {
return (@"I am an engine. Vroom!");
}
@end</span>
然后定义汽车(Car)类本身。
在实现Car类的代码中,我们定义了一个类型为id的init的方法。这里的作用是:初始化实例变量,创建1个engine变量和4个tire变量。使用new创建新对象的时候,系统会自动给对象分配内存,然后自动调用init方法,使该对象进入可以使用的状态。
关于init方法中,if语句:if(self = [super init]),这个条件是什么意思呢?为了让超类(在这里是指:NSObject)将所有需要的初始化工作一次性完成。需要调用[super init]。init方法的返回值(id类型数据,即泛型对象指针)就是被初始化的对象。而将返回的结果赋值给self则是Objective-c的惯例。这样做是为了防止超类在初始化过程中返回的对象与一开始创建的不一致。
最后在main主函数中,创建一个Car对象,然后调用drive方法,代码如下:
<span style="font-size:12px;"> int main(int argc, const char * argv[])
{
Car *car;
car = [Car new];
[car drive];
return 0;
}</span>
运行效果: