Lesson 3. 类的定义
编程语言
2009年7月31日星期五
1
源文件
Source files
加入新的对象种类的方式:定义新的类
Objective-C

中,类的定义分为两个部分:
Interface:声明了类与父类的名字、方法和实例 变量
接口
Implementation:包含了方法的实现(真正意义 上的定义了类的行为)
实现
2009年7月31日星期五
2
源文件
编译器并不要求将接口与实现的代码分开到不同的文 件
一个文件可以同时声明和定义多个类 每一个类用一对接口/实现源文件来书写是习惯用法
这样的写法能更清楚地反应每一个类作为一个个体的 状态
2009年7月31日星期五
3
源文件 源文件的命名应与类名相一致
.h
接口文件以
为后缀名
.m
实现文件以
文件为后缀名
2009年7月31日星期五
4
接口
Interface
@interface
@end
接口的声明以
结束:
编译指令开始,以
指令
@interface ClassName : ItsSuperclass {
instance variable declarati*****
} method declarati***** @end
2009年7月31日星期五
5
接口
第一行:声明了要定义的类的名称 冒号后面指定了父类的名字 通过指定父类来确定新类在继承树中的位置 如果不指定父类的话,则新类被认为是一个根类,如
NSObject

2009年7月31日星期五
6
接口
大括号中所括的部分是实例变量的声明 实例变量构成了对象中的数据结构
Rectangle
类中的部分实例变量:
float width; float height; BOOL filled; NSColor *fillColor;
2009年7月31日星期五
7
接口 方法的声明在大括号之后,
@end
指令之前 只有类对象能够使用的方法,类方法以+号开头:
+ alloc;
只有实例对象能够使用的方法,实例方法以-号开头:
- (void)display;
尽管并不常见,实例方法与类方法可以重名,因为它们 的使用者不同
2009年7月31日星期五
8
接口
访问器的命名规则: 假设声明如下实例变量:float radius;
getter - (float)radius;
setter
方法与实例变量同名,并有同样类型的返回值:
“set”,需要一个同样
方法名称是实例变量的名称前加
void: - (void)setRadius: (float)aRadius;
类型的传入参数,返回
2009年7月31日星期五
9
接口
返回值的默认类型
如果没有显式地指定返回值的类型,则方法默认返回
+ alloc;
id
2009年7月31日星期五
10
接口
如果方法中的参数多于一个,则参数依次在方法名中进行声 明,以冒号隔开
方法名被参数隔成一段一段,在声明中和消息表达式中都是 同一形式
- (void)setWidth:(float)width height:(float)height;
如果需要声明可变数目的参数,则用逗号和省略号来表示:
- makeGroup:group, ...;
2009年7月31日星期五
11
接口 任何其它源文件想要使用一个接口时,都要包含
include
(
)它
import
接口包含使用#
指令来进行:
import “Rectangle.h”
#
<>
“”,且需
如果要包含类库中的类接口,使用
要指定类在类库中的目录:
#import <UIKit/UIKit.h>
而不是
2009年7月31日星期五
12
接口
为了体现继承关系,子类的接口一般都默认已经包含 了父类的接口文件
当接口的定义中提到了没有包含到的类时,需要进行 额外的包含或者类名使用声明:
@class Circle,
Rectangle;
@class
Circle
Rectangle
使用
指令简单地告诉编译器


接下来的接口定义中将作为类名使用
2009年7月31日星期五
13
接口
@class
指令只声明了类名的使用以规避编译错误,并 未包含这些类的接口文件
在实现代码中若还需用到这些类中的细节定义,则需 要在实现文件中重新包含这些类
@class
指令可用于避免出现两个接口文件互相包含的 编译错误
2009年7月31日星期五
14
接口
小结:接口的作用
接口告诉用户它定义的类在继承树中是如何与别的 类连接的,而且对哪些类作了引用
接口告诉编译器它所定义的对象应当包含哪些实例 变量
接口告诉用户它有哪些方法可以被调用(仅供类实 现内部使用的方法不在接口中声明)
2009年7月31日星期五
15