第三章面向對象編程
一、間接(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);
}