博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Objective-C学习笔记八:类的定义二
阅读量:6147 次
发布时间:2019-06-21

本文共 4814 字,大约阅读时间需要 16 分钟。

原文地址:

  我们继续来扩展分数类Fraction,两个分数相加,再不考虑它们是不是最简分数的情况下,有下面的公式成立:a/b+c/d=(ad+bc)/bd,那么我们在Fraction类中添加一个add方法,代码如下: 

 

1 #import 
2 3 @interface Fraction : NSObject 4 5 @property int numerator,denominator; 6 7 -(void) print; 8 -(double) convertToNum; 9 -(void) setTo:(int) n over: (int) d;10 -(void) add:(Fraction *) f;11 12 @end

 

  注意这个add方法的定义,参数类型是指针类型的Fraction,那么编写函数实现: 

 

1 #import "Fraction.h" 2  3 @implementation Fraction 4  5 @synthesize numerator,denominator; 6  7 -(void) print 8 { 9     NSLog(@"%i/%i",numerator,denominator);10 }11 12 -(double) convertToNum13 {14     if(denominator!=0){15         return (double)numerator/denominator;16     }else{17         return NAN;18     }19 }20 21 -(void) setTo:(int)n over:(int)d22 {23     numerator=n;24     denominator=d;25 }26 27 -(void) add:(Fraction *)f28 {29     numerator=numerator*f.denominator+denominator*f.numerator;30     denominator=denominator*f.denominator;31 }32 33 @end

 

  这个实现方法内的计算过程就是数学公式的程序化。之后修改主函数,代码如下: 

1 #import "Fraction.h" 2  3 int main(int argc, const char * argv[]) 4 { 5     @autoreleasepool { 6         Fraction *fractionA = [Fraction new]; 7         Fraction *fractionB = [Fraction new]; 8          9         [fractionA setTo:10 over:406];10         [fractionB setTo:23 over:901];11         12         [fractionA print];13         [fractionB print];14         15         [fractionA add:fractionB];16         17         [fractionA print];18     }19     return 0;20 }

  编译运行,我们得到如下结果: 

 

    当然这里我们没有对分数进行化简。 
    当有方法定义的时候,就会涉及到局部变量的概念。在方法内部定义的变量就是局部变量,局部变量没有初始值,需要人为进行赋值操作。这些变量的作用域就是这个方法调用的生命周期,当方法返回结果后,本次局部变量就都消失了。也就是每次方法调用时,重新生成局部变量,赋值,使用,返回结果后它们就消失了。我们继续来编写分数化简的方法,其中使用到了局部变量,代码如下: 

 

1 #import 
2 3 @interface Fraction : NSObject 4 5 @property int numerator,denominator; 6 7 -(void) print; 8 -(double) convertToNum; 9 -(void) setTo:(int) n over: (int) d;10 -(void) add:(Fraction *) f;11 -(void) reduce;12 13 @end

 

 我们加入了reduce方法,数学概念中,分数的化简就是找出分子和分母的最大公约数,然后分子分母同时除以这个最大公约数,就得到了最简分数。我们之前用到过求最大公约数的示例,那么这里我们直接使用,实现代码中这样来写: 

 

1 -(void) reduce 2 { 3     int n=numerator; 4     int d=denominator; 5     int temp; 6      7     while (d!=0) { 8         temp=n%d; 9         n=d;10         d=temp;11     }12     13     numerator/=n;14     denominator/=n;15 }

 

  之后修改主函数: 

 

1 #import "Fraction.h" 2  3 int main(int argc, const char * argv[]) 4 { 5     @autoreleasepool { 6         Fraction *fractionA = [Fraction new]; 7         Fraction *fractionB = [Fraction new]; 8          9         [fractionA setTo:10 over:406];10         [fractionB setTo:23 over:901];11         12         [fractionA print];13         [fractionB print];14         15         [fractionA add:fractionB];16         17         [fractionA reduce];18         19         [fractionA print];20     }21     return 0;22 }

 

 编译运行后,我们就得到如下的结果了: 

 

    扩展我们说过的局部变量的含义,方法的参数也是局部变量,比如对于方法-(double) add: (double) x,那么调用这个方法时可以是这样的[data add: val]。在方法中我们使用的是x变量,而传入的是val变量,val变量赋值给x后,val本身没有变化,而作为局部变量的x发生的所有变化都与val无关。 
    而上面我们传入对象参数时,则可以在方法中修改其实例变量的值,这是因为我们传递的是数据存储的引用位置,所以才能在方法中修改其中的值。 
    关键字static可以修饰变量,当static修饰局部变量时,那么这个值可以保存多次调用该方法所得到的值。而且它会在程序开始执行时初始化一次,因此需要对其先赋好值。如果static修饰的不是局部变量,那么所有的方法就都可以访问它们了。 
    对于分数化简的方法,我们继续探究。如何在add方法内调用reduce方法,那么在主函数中就不必再次调用该方法,而且分数做完加法后自动完成化简也是更佳的做法。那么问题就是如何在一个方法内调用本类定义的其它方法,关键字self就是完成这个功能的。self关键字用来指明对象是该方法的调用者,比如[self reduce]。上述方法就可以改为: 

 

1 -(void) add:(Fraction *)f2 {3     numerator=numerator*f.denominator+denominator*f.numerator;4     denominator=denominator*f.denominator;5     [self reduce];6 }

 

 结合上面的代码,分数化简后返回化简后的分数,此时如果我们想返回这个分数对象,又改怎么做呢?这就是方法返回对象的问题,上述代码继续扩展如下: 

 

1 #import 
2 3 @interface Fraction : NSObject 4 5 @property int numerator,denominator; 6 7 -(void) print; 8 -(double) convertToNum; 9 -(void) setTo:(int) n over: (int) d;10 -(void) add:(Fraction *) f;11 -(Fraction *)add2:(Fraction *)f;12 -(void) reduce;13 14 @end

 

  我们加入了新方法的定义,防止重名方法,那么实现如下: 

 

1 -(Fraction *)add2:(Fraction *)f2 {3     Fraction *result=[Fraction new];4     result.numerator=numerator*f.denominator+denominator*f.numerator;5     result.denominator=denominator*f.denominator;6     [result reduce];7     return result;8 }

 

    主函数修改如下: 

 

1 #import "Fraction.h" 2  3 int main(int argc, const char * argv[]) 4 { 5     @autoreleasepool { 6         Fraction *fractionA = [Fraction new]; 7         Fraction *fractionB = [Fraction new]; 8         Fraction *resultFraction; 9         10         [fractionA setTo:10 over:406];11         [fractionB setTo:23 over:901];12         13         [fractionA print];14         [fractionB print];15         16         resultFraction=[fractionA add2:fractionB];17         18         [resultFraction print];19 20     }21     return 0;22 }

 

编译运行后,我们得到如下结果: 

 

    到目前为止,我们已经编写了一个功能相对完整的类Fraction,对于此时的头文件,完全可以作为我们处理分数的方法库,并且可以将我们编写的程序提供给他人使用。如果要添加新的方法而不修改已有方法,可以通过定义扩展类来实现该目的。

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/maying/archive/2013/03/10/2952892.html

你可能感兴趣的文章
使用局部标准差实现图像的局部对比度增强算法。
查看>>
2017-2018-1 20165313 《信息安全系统设计基础》第八周学习总结
查看>>
《代码敲不队》第四次作业:项目需求调研与分析
查看>>
菜鸡互啄队—— 团队合作
查看>>
HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法...
查看>>
SparseArray
查看>>
第二章
查看>>
android背景选择器selector用法汇总
查看>>
[转]Paul Adams:为社交设计
查看>>
showdialog弹出窗口刷新问题
查看>>
java
查看>>
Vue.js连接后台数据jsp页面  ̄▽ ̄
查看>>
关于程序的单元测试
查看>>
「一本通 1.1 例 1」活动安排
查看>>
input autocomplete用法
查看>>
C语言学习笔记之数组(Arrays)
查看>>
Head First 设计模式 (Eric Freeman / Elisabeth Freeman / Kathy Sierra / Bert Bates 著)
查看>>
表单隐藏域
查看>>
利用伪类:before&&:after实现图标库图标
查看>>
第六(匿名函数、内置函数、正则等常用模块)
查看>>