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相加,如下执行计算:
下面是@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:方法不影响其接收器的值。