7.4 具有多个参数的方法

继续使用Fraction类并对它做一些补充。你已经定义了6个方法。如果有一个方法能够只用一条消息既可设置numerator同时又可设置denominator,就太好了。通过列出每个连续的参数并用冒号将其连起来,就可以定义一个接收多个参数的方法。用冒号连接的参数将成为这个方法名的一部分。例如,方法名addEntryWithName:andEmail:表示接收两个参数的方法,这两个参数可能是姓名和电子邮件地址。方法addEntryWithName:andEmail:andPhone:是接收以下3个参数的方法,一个姓名、一个电子邮件地址和一个电话号码。

同时设置numerator和denominator的方法可以命名为setNumberator:andDenominator:,你可能采用以下形式:


[myFraction setNumerator:1 andDenominator:3];


这种方法还不错。实际上,这是命名方法的首选方式。但是必须为方法指定更易阅读的名称。例如,觉得setTo:over:如何?这个名称乍一看并没有什么吸引力,通过将myTraction设置为1/3,比较这个名称和前面的名称:


[myFraction setTo:1 over:3];


我认为这个名称的可读性更强,但是,究竟选择哪种命名方式由你决定(实际上,有些人更喜欢第一种命名方式,因为它明确地引用了类中的实例变量名称)。再者,选择好的方法名对整个程序的可读性是很重要的。写出实际的消息表达式可帮助你找出一个最好的。

让我们应用这种新方法。首先,在接口文件中添加setTo:over:声明。如代码清单7-2所示。

代码清单7-2接口文件:Fraction.h


import<Foundation/Foundation.h>

//Define the Fraction class

@interface Fraction:NSObject

{

int numerator;

int denominator;

}

@property int numerator, denominator;

-(void)print;

-(void)setTo:(int)n over:(int)d;

-(double)convertToNum;

@end


然后,在实现文件中添加新方法定义。

代码清单7-2实现文件:Fraction.m


import“Fraction.h”

@implementation Fraction

@synthesize numerator, denominator;

-(void)print

{

NSLog(@“i/%i”,numerator, denominator);

}

-(double)convertToNum

{

if(denominator!=0)

return(double)numerator/denominator;

else

return 1.0;

}

-(void)setTo:(int)n over:(int)d

{

numerator=n;

denominator=d;

}

@end


新的setTo:over:方法仅接收两个整型参数,n和d,并把它们赋值给该分数对应的域numerator和denominator。

下面是新方法的测试程序。

代码清单7-2测试文件:main.m


import“Fraction.h”

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

{

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

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

[aFraction setTo:100 over:200];

[aFraction print];

[aFraction setTo:1 over:3];

[aFraction print];

[aFraction release];

[pool drain];

return 0;

}


代码清单7-2输出


100/200

1/3


7.4.1 不带参数名的方法

创建方法名时,参数名实际上是可选的。例如,可以如下声明一个方法:


-(int)set:(int)n:(int)d;


注意,和先前的例子不同,这个方法的第二个参数没有名字。这个方法名为set:,两个冒号表示这个方法有两个参数,虽然没有全部命名。

要调用set:方法,可以使用冒号作为参数分隔符,如下所示:


[aFraction set:1:3];


在编写新方法时,省略参数名不是一种好的编程风格,因为它使程序很难读懂并且很不直观,特别是当使用的方法参数特别重要时更是如此。