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!
「調用相同方法的另一種方式」真的嗎?它不是直接訪問公共變量嗎? – Thilo
你可能是對的。不過,最終的結果在這種情況下是一樣的。我會編輯我的答案以反映這一點。 – coopersita
它恰恰是調用相同方法的另一種方式。編譯器將'myRect.origin = myPoint'重寫爲'[myRect setOrigin:myPoint]'。結果與直接ivar設置('myRect-> origin = myPoint')不同,因爲setter處理釋放ivar中的舊值並保留新值。此外,@Thilo,它不是一個公共變量,並且編譯器實際上不會允許您從外部代碼執行'myRect-> origin' - 在ObjC中,默認情況下ivars受到保護。 –