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