4.4 计算器类

现在定义一个新类。我们将创建一个Calculator类,它是一个简单的四则计算器,可用来执行加、减、乘和除运算。类似于常见的计算器,这种计算器必须能够记录累加结果,或者通常所说的累加器。因此,方法必须能够执行以下操作:将累加器设置为特定值、将其清空(或设置为0),以及在完成时检索它的值。代码清单4-6包括这个新类的定义和一个用于试验该计算器的测试程序。

代码清单4-6


//Implement a Calculator class

import<Foundation/Foundation.h>

@interface Calculator:NSObject

{

double accumulator;

}

//accumulator methods

-(void)setAccumulator:(double)value;

-(void)clear;

-(double)accumulator;

//arithmetic methods

-(void)add:(double)value;

-(void)subtract:(double)value;

-(void)multiply:(double)value;

-(void)divide:(double)value;

@end

@implementation Calculator

-(void)setAccumulator:(double)value

{

accumulator=value;

}

-(void)clear

{

accumulator=0;

}

-(double)accumulator

{

return accumulator;

}

-(void)add:(double)value

{

accumulator+=value;

}

-(void)subtract:(double)value

{

accumulator-=value;

}

-(void)multiply:(double)value

{

accumulator*=value;

}

-(void)divide:(double)value

{

accumulator/=value;

}

@end

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

{

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

Calculator*deskCalc;

deskCalc=[[Calculator alloc]init];

[deskCalc clear];

[deskCalc setAccumulator:100.0];

[deskCalc add:200.];

[deskCalc divide:15.0];

[deskCalc subtract:10.0];

[deskCalc multiply:5];

NSLog(@“The result is%g”,[deskCalc accumulator]);

[deskCalc release];

[pool drain];

return 0;

}


代码清单4-6输出


The result is 50


Calcauator类只有一个实例变量,以及一个用于保存累加器值的double变量。方法定义的本身非常直观。

要注意调用multiply方法的消息:


[deskCalc multiply:5];


该方法的参数是一个整数,而它期望的参数类型却是double。因为方法的数值参数会自动转换以匹配期望的类型,所以此处不会出现任何问题。multiply:期望使用double值,因此调用该函数时,整数5将自动转换成双精度浮点值。即使自动转换过程会自己进行,然而在调用方法时提供正确的参数类型仍是一个较好的程序设计习惯。

要认识到与Fraction类不同,Fraction类可能使用多个不同的分数,在这个程序中可能希望只处理单个Calculator对象。然而,定义一个新类以便更容易地处理这个对象仍是有意义的。从某些方面讲,可能要为计算器添加一个图形前端,以便用户能够在屏幕上实际点击按钮,与系统或电话中已安装的计算器应用程序一样。

在以后的若干练习中,可以看到定义Calculator类的另一个好处和便于扩展有关。