8.2.2 @class指令

现在可以设置矩形(或正方形)的宽、高及原点。首先,完整地看一下接口文件Rectangle.h:


import<Foundation/Foundation.h>

@class XYPoint;

@interface Rectangle:NSObject

{

int width;

int height;

XYPoint*origin;

}

@property int width, height;

-(XYPoint*)origin;

-(void)setOrigin:(XYPoint*)pt;

-(void)setWidth:(int)w andHeight:(int)h

-(int)area;

-(int)perimeter;

@end


在Rectangle.h头文件中使用一个新的指令:


@class XYPoint;


这是因为编译器在遇到为Rectangle定义的实例变量XYPoint时,必须了解XYPoint是什么。类名还分别用在setOrigin:和origin方法的参数及返回类型声明中。你还有另一个选择。可以如下所示导入头文件来代替它:


import“XYPoint.h”


使用@class指令提高了效率,因为编译器不需要处理整个XYPoint.h文件(虽然它很小);而只需知道XYPoint是一个类名字。如果需要引用XYPoint类中方法,@class指令是不够的,因为编译器需要更多消息。它需要知道该方法中有多少参数、它们是什么类型、方法的返回类型是什么。

下面填充新的XYPoint类和Rectangle方法的空白,这样就可以在一个程序中测试所有内容。首先,代码清单8-4显示了XYPoint类的实现文件。

代码清单8-4显示了Rectangle类的新方法。

代码清单8-4 Rectangle.m添加的方法


import“XYPoint.h”

-(void)setOrigin:(XYPoint*)pt


{

origin=pt;

}

-(XYPoint*)origin

{

return origin;

}

@end


以下是完整的XYPoint和Rectangle类定义,接着是测试程序。

代码清单8-4 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


代码清单8-4 XYPoint.m实现文件


import“XYPoint.h”

@implementation XYPoint

@synthesize x, y;

-(void)setX:(int)xVal andY:(int)yVal

{

x=xVal;

y=yVal;

}

@end


代码清单8-4 Rectangle.h接口文件


import<Foundation/Foundation.h>

@class XYPoint;

@interface Rectangle:NSObject

{

int width;

int height;

XYPoint*origin;

}

@property int width, height;

-(XYPoint*)origin;

-(void)setOrigin:(XYPoint*)pt;

-(void)setWidth:(int)w andHeight:(int)h;

-(int)area;

-(int)perimeter;

@end


代码清单8-4 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


代码清单8-4测试程序


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;

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;

}


代码清单8-4输出结果


Rectangle w=5,h=8

Origin at(100,200)

Area=40,Perimeter=26


在main例程中,为名为myRect的矩形和名为myPoint的点分配了空间并进行初始化。使用方法setX:和Y:,将myPoint值设置为(100,200)。在分别将矩形的宽和长设置为5和8之后,调用setOrigin方法,将矩形原点设置为myPoint中指定的点。通过三个NSlog方法调用检索并输出值。表达式


myRect.origin.x


接收存取器方法origin方法返回的XYPoint对象,并对其应用方法x来取得矩形原点的x坐标。以同样的方式,表达式


myRect.origin.y


检索矩形原点的y坐标。