7.4.2 关于分数的操作

继续探讨上面提到的Fraction类。首先,编写一个方法,将一个分数与另一个分数相加,将一个方法命名为add:,并且把一个分数作为参数。这个新方法的声明如下所示:


-(void)add:(Fraction*)f;


注意参数f的声明:


(Fraction*)f


这条语句说明add:方法的参数类型是Fraction类。星号是必需的,所以声明


(Fraction)f


是不正确的。你将把一个分数作为参数传递给add:方法,而这一方法将其添加到消息的接收器中。所以消息表达式


[aFraction add:bFraction];


将Fraction bFraction和Fraction aFraction相加。就像一个快速数学复习程序,它用于将分数a/b和c/d相加,如下执行计算:

7.4.2 关于分数的操作 - 图1

下面是@implementation部分的新方法代码:


//add a Fraction to the receiver

-(void)add:(Fraction*)f

{

//To add two fractions:

//a/b+c/d=((ad)+(bc))/(b*d)

numerator=numerator*f.denominator

+denominator*f.numerator;

denominator=denominator*f.denominator;

}


不要忘了通过域numerator和donominator,可以指定Fraction作为消息的接收器。而另一方面,不能用这种方法直接指定参数f的实例变量。相反,必须通过对f应用点运算符来获得实例变量(或者通过向f发送相应的消息)。

假设将新add:方法的声明和定义添加到接口和实现文件中。代码清单7-3是示例测试和输出。

代码清单7-3测试文件:FractionTest.m


import“Fraction.h”

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

Fraction*aFraction=[[Fraction alloc]init];

Fraction*bFraction=[[Fraction alloc]init];

//Set two fractions to 1/4 and 1/2 and add them together

[aFraction setTo:1 over:4];

[bFraction setTo:1 over:2];

//Print the results

[aFraction print];

NSLog(@);

[bFraction print];

NSLog(@);

[aFraction add:bFraction];

[aFraction print];

[aFraction release];

[bFraction release];

[pool drain];

return 0;

}


代码清单7-3输出


1/4

+

1/2

=

6/8


这个测试程序非常易懂。两个分数,名为aFraction和bFraction的两个Fraction被分配空间和初始化。然后分别被赋值为1/4和1/2。然后将Fraction bFraction与Fraction aFraction相加,之后显示相加的结果。注意add:方法将消息对象的参数相加,所以对象被修改了。在main程序尾打印aFraction的值时将证明该点。应该注意,要在调用add:方法之前显示aFraction的值,这样可以在add:方法改变aFraction的值之前显示其原值。本章的结尾,你将重新定义add:方法,以便add:方法不影响其接收器的值。