编程中的复合就好像音乐中的作曲一样,讲多个组件组合在一起配合使用,从而得到完整的作品。创作乐曲时,作曲人可能会选择低音管声部和双皇冠声部组成交响乐的二声部。在软件开发中,程序员可能会用一个Pedal(脚踏板)对象和一个Tire(轮胎)对象组合出虚拟的独轮车。
在Objective-C中,复合是童工包含作为实例变量的对象指针实现的。因此上述的虚拟独轮车应该拥有一个指向Pedal对象的指针和一个指向Tire对象的指针
#import <Foundation/Foundation.h> //Pedal @interface Pedal : NSObject @end //tire @interface Tire : NSObject @end @implementation Tire -(NSString *)description { return (@"I am a tire"); } @end //engine @interface Engine : NSObject @end @implementation Engine -(NSString *) description { return (@"I am an engine"); } @end //car //每一个car对象都会为指向engine和tires的指针分配内存。但是真正包含在car的并不是engine和tires变量,而只是内存中存在的其它对象的引用。 //为新建的Car分配内存时,这些指针奖杯初始化为nil(零值)也就是说这辆汽车现在还没有发动机也没有轮胎,你可以将他们想像成还在流水线上组装的汽车框架。 @interface Car : NSObject { Engine *engine;//engine和tires实力变量是复合的,因为他们是Car的实例变量。 Tire *tires[4]; } -(void) print; @end @implementation Car //若要超类(NSObject)可以完成所需的一次性初始化,需要调用[super init],init方法返回的值(id型数据,既泛型对象指针)描述了被初始化的对象 //将[super init]的结果赋给self时Objective-C的标准惯例,这么做时为了防止超类在初始化过程中返回的对象不同于原先创建的对象 -(id)init { if(self==[super init]){ engine=[Engine new]; tires[0]=[Tire new]; tires[1]=[Tire new]; tires[2]=[Tire new]; tires[3]=[Tire new]; } return (self); } -(void)print { NSLog(@"%@",engine); NSLog(@"%@",tires[0]); NSLog(@"%@",tires[1]); NSLog(@"%@",tires[2]); NSLog(@"%@",tires[3]); } @end int main (int argc, const char * argv[]) { Car *car; car=[Car new]; [car print]; return (0); }