为什么需要复合:
某一个复杂的类,需要由多个不同的部分组成,比如电脑需要由主机键盘显示器组成,这时候就可以用到复合,将部分作为主体的实例变量复合和继承
继承是“is A”关系;复合是“has A”关系。
复合的实现:
1、复合通过包含作为实例变量的的对象指针实现的。
@interface Unicycle : NSObject
#import "Pedal.h"
#import "Tire.h"
{
Pedal *pedal;
Tire *tire;
}//Pedal和tire通过复合的方式组成了Unicycle
//严格地讲,只有对象间的组合才能叫做复合,诸如int、float、enum和 struct等基本类型都被认为是对象的一部分。
2、存取方法——用来读取或者改变某个对象属性的方法。
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Car : NSObject
{
Engine *engine;
Tire * tires[4];
}
- (Engine *) engine;//getter访问器
- (void) setEngine : (Engine *)newEngine;//setter访问器
- (Tire *) tireAtIndex : (int)index;
- (void) setTire : (Tire *)tire atIndex : (int)Index;
@end
//当然,我们可以直接使用@property为其声明对象属性以及存取方法
@Class
关键字@class的作用
OC中在相互导入的时候编译是不通过的,会导致错误,解决办法就是使用@class关键字
@class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。步骤
A类中的导入B.h方式不变,在B.h头文件中使用@class关键字引入A类型,使其编译通过,然后在B.m文件中导入A.h文件,A使其运行通过。
循环引用解决方法
一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)
聚合:表示两个对象之间是整体和部分的弱关系,部分的生命周期可以超越整体。
组合:表示两个对象之间是整体和部分的强关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在。
-
-
-15.8.4
-15.8.11