2012-10-09 22 views
1

Kochan-在Objective-C中編程。繼承的簡單例子(來自Kochan的書)

無法理解兩行代碼。 (標記爲 「意見」)

XYPoint.h接口文件

#import <Foundation/Foundation.h> 
@interface XYPoint: NSObject 
{ 
int x; 
int y; 
} 
@property int x, y; 
-(void) setX: (int) xVal andY: (int) yVal;  
@end 

XYPoint.m實現文件

#import "XYPoint.h" 
@implementation XYPoint.h 
@synthesize x, y; 
-(void) setX: (int) xVal andY: (int) yVal 
{ 
x = xVal; 
y = yVal; 
} 
@end 

Rectangle.h接口文件

#import <Foundation/Foundation.h> 
@class XYPoint; 
@interface Rectangle: NSObject 
{ 
int width; 
int height; 
XYPoint *origin; // What does this line mean? 
} 
@property int width, height; 
-(XYPoint *) origin; 
-(void) setOrigin: (XYPoint *) pt; 
-(void) setWidth: (int) w andHeight: (int) h; 
-(int) area; 
-(int) perimeter; 
@end 

Rectangle.m實施文件

#import "Rectangle.h" 
@implementation Rectangle 
@synthesize width, height; 
-(void) setWidth: (int) w andHeight: (int) h 
{ 
width = w; 
height = h; 
} 
–(void) setOrigin: (XYPoint *) pt 
{ 
origin = pt; 
} 
–(int) area 
{ 
return width * height; 
} 
–(int) perimeter 
{ 
return (width + height) * 2; 
} 
–(XYPoint *) origin 
{ 
return origin; 
} 
@end 

測試程序

#import "Rectangle.h" 
#import "XYPoint.h" 
int main (int argc, char *argv[]) 
{ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
Rectangle *myRect = [[Rectangle alloc] init]; 
XYPoint *myPoint = [[XYPoint alloc] init]; 
[myPoint setX: 100 andY: 200]; 
[myRect setWidth: 5 andHeight: 8]; 
myRect.origin = myPoint; // What does this line mean? 
NSLog (@"Rectangle w = %i, h = %i", myRect.width, myRect.height); 
NSLog (@"Origin at (%i, %i)",myRect.origin.x, myRect.origin.y); 
NSLog (@"Area = %i, Perimeter = %i", 
[myRect area], [myRect perimeter]); 
[myRect release]; 
[myPoint release]; 
[pool drain]; 
return 0; 
} 

輸出

Rectangle w = 5, h = 8 
Origin at (100, 200) 
Area = 40, Perimeter = 26 

此行科昌的解釋 myRect.origin = myPoint; 是:「在將矩形的寬度和高度分別設置爲5和8後, 調用setOrigin方法將矩形的原點設置爲由 myPoint指示的點。」 但是我們沒有調用setOrigin!

回答

1
myRect.origin = myPoint; 

是一樣的(幾乎)作爲

[myRect setOrigin:myPoint]; 

這是實現相同的結果只是以不同的方式。

如馬赫什解釋的,

XPoint *origin; 

聲明類型XPOINT的指針(可變)稱爲原點。

+0

「調用相同方法的另一種方式」真的嗎?它不是直接訪問公共變量嗎? – Thilo

+0

你可能是對的。不過,最終的結果在這種情況下是一樣的。我會編輯我的答案以反映這一點。 – coopersita

+0

它恰恰是調用相同方法的另一種方式。編譯器將'myRect.origin = myPoint'重寫爲'[myRect setOrigin:myPoint]'。結果與直接ivar設置('myRect-> origin = myPoint')不同,因爲setter處理釋放ivar中的舊值並保留新值。此外,@Thilo,它不是一個公共變量,並且編譯器實際上不會允許您從外部代碼執行'myRect-> origin' - 在ObjC中,默認情況下ivars受到保護。 –