第三章面向对象编程
一、间接(inderection)
即使用某种东西指向你想要的对象,或使用某事物代为办理某种工作
1、变量与间接
举例代码:
int i;
int count = 5;
for(i = 1; i <= count; i++){
NSLog(@"%d\n",i);
}
其中count就是间接
2、文件名的间接
将处理内容保存到外部文件,使用文件流读取
二、在面向对象编程中使用间接
// Draw the shapes
void drawShapes (id shapes[], int count)
{
int i;
for (i = 0; i < count; i++) {
id shape = shapes[i];
[shape draw];
}
} // drawShapes
代码解释:
1、 id代表identifier标识符,id是一种泛型,用于表示任何种类的对象,是一个指针指向 某个结构struct
2、 [shape draw]
在C语言中[]方括号用于引用数组元素
在Objective-C中用于通知对象进行某种操作,在这里就是调用shape对象的draw方法
三、Objective-C中的OOP
@interface接口,定义类的公共接口
创建类对象之前,Objective-C编译器需要读取类内部信息,使用@interface可以把信息传递给编译器
示例代码:
@interface Circle:NSObject 表示为Circle类定义的接口,并且Circle类继承自NSObject
{ 括号内是Circle类的数据成员
ShapeColor fillColor; 名为fillColor的ShapeColor类对象
其值为Circle类对象的实例变量
ShapeRect bounds; 名为bounds的ShapeRect类对象
}
- (void) setFillColor : (ShapeColor) fillColor; (ShapeColor)表示需要的参数类型
- (void) setBounds : (ShapeRect) bounds; :冒号表示方法需要参数
- (void) draw; 方法声明,前面的短线表明这是Objective-C的方法声明,
这是区分函数原型与方法声明的方式,函数原型中没有先行短线
表示这是一个新方法
void表示无返回值
@end //Circle 表示已经完成了Circle类的声明
Objective-C方法可以返回与C相同的类型:标准类型(整型、浮点型和字符型)、指针、对象引用和结构
中缀符(infix notation)
Objective-C中有中缀符的语法,即方法的名称及其参数时和在一起的
例如,调用方法时将参数传入
[circle setFillColor : red]
带两个参数的方法调用
[textThing setStringValue : @"hello there" color:blue ]
C中调用函数则直接把参数放在方法名之后,例:setTextThingValueColor(textThing, @"hello there" , blue);
@implementation实现,即接口的实现类
举例代码:
@implementation Circle 编译器指令,表示为某个类提供代码编译器指令后不用书写分号
- (void) setFillColor : (ShapeColor) c c为形式参数,为避免名称冲突不使用传入时的名称
{
fillColor = c;
}//setFillColor
-(void) setBounds :(ShapeRect) b b是随着隐藏参数self传递来的,方法调用时会将自身
{ 对象隐蔽的传度过来
bounds = b;
}//setBounds
-(void) draw 方法定义不必按照@interface中的顺序
{ 出现,甚至可以书写无声明的方法该方法
NSLog(@"drawing a circle at 将成为实现类的私有方法(Objective-C
(%d %d %d %d) in %@", 中并不存在真正的私有方法,即无法将方
bounds.x,bounds.y,bounds.width, 法隐藏)
bounds.height,colorName(fillColor));
}//draw
实例化(instantiation)对象
创建新对象需要发送new消息
举例代码:
int main (int argc, const char * argv[])
{
id shapes[1]; 定义类型为id指针,长度为1名字为shapes的数组
ShapeRect rect0 = {0,0,10,30}; 定义一个矩形并为其提交4个坐标点参数
shapes[0] = [Circle new]; 为数组第一个元素实例化一个Circle类
[shapes[0] setBounds : rect0]; 数组元素调用Circle类的方法
[shapes[0] setFillColor : kRedColor];
return(0);
}