说明:建立类之间的关系除了
继承
还有复合
5.1 什么是复合
说明:使用复合可组合多个对象,让它们分工协作
原理:在0-C
中,复合是通过包含作为实例变量的对象指针实现的。
5.2 自定义NSLog()
说明:在类中提供
description方法
就可以自定义NSLog()
会如何输出对象。
在init中初始化实例属性
说明:使用
new
创建新对象时后台进行了两步
- 为对象分配内存,用来存放
实例变量
(如果实例属性是对象,被初始化为nil
)- 自动调用
init方法
,之后对象进入可用状态扩展:在
init方法中
使用if (self = [super init])
是为了完成父类的初始化并确保父类返回的对象和一开始创建的对象是一致的。
1 |
|
5.3 存取方法
说明:是用来读取或改变某个对象属性的方法。
存取方法 | 方法命名(Cocoa惯例) | 用途 |
---|---|---|
getter | getPropertyName | 返回实例变量的值 |
setter | propertyName | 将实例变量的值赋为参数所指向的值 |
建议:如果要对对象中的属性进行操作,因该尽量使用对象提供的存取方法,而不是直接改变对象里面的值。
注意:不要将get
作为getter方法的前缀,因为get
出现在Cocoa
的方法名称中意味着这个方法会将你传递的参数作为指针来返回数值。
5.3.1 设置 engine 属性的存取方法
说明:在
@interface
和@implementation
中同时增加存取方法。
扩展:在内存管理和对象的多有权方面Engin
的getter
方法和setter
方法还存在着问题。
5.3.2 设置 tires 属性的存取方法
说明:不仅要知道新轮胎,还要知道新轮胎的位置。
注意:防御式编程
对无效索引进行防御。
5.3.3 Car 类代码的其他变化
1 |
|
5.4 扩展 CarParts 程序
说明:结合
继承
和复合
1 |
|
5.5 复合还是继承
说明:在进行面向对象编程时通常会犯这样的错误-任何东西都想使用继承。
比较 | 类之间的关系 |
---|---|
继承 | is a |
复合 | has a |