分类(类的扩展)

作者:追风剑情 发布于:2019-2-25 17:08 分类:Objective-C

示例:分类、类的扩展

Fraction.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Fraction : NSObject
  4.  
  5. //@property指令让编译器自动为numerator、denominator生成getter、setter方法
  6. @property int numerator, denominator;
  7.  
  8. -(void) print;
  9. -(double) convertToNum;
  10. -(void) setTo: (int) n over: (int) d;
  11. -(void) set: (int) n : (int) d;
  12. -(void) reduce;
  13. +(Fraction *) allocF;
  14. +(int) count;
  15.  
  16. @end


FractionMathOps.h

  1. // Fraction.h 分类接口
  2. // 按照惯例的命名方式为 类名分类名.h FractionMathOps.h
  3. // 也可以 类名+分类名.h Fraction+MathOps.h
  4. #import "Fraction.h"
  5.  
  6. @interface Fraction (MathOps)
  7. -(Fraction *) add: (Fraction *) f;
  8. -(Fraction *) mul: (Fraction *) f;
  9. -(Fraction *) sub: (Fraction *) f;
  10. -(Fraction *) div: (Fraction *) f;
  11. @end


Fraction.m

  1. #import "Fraction.h"
  2.  
  3. // 类的扩展:
  4. // 在实现中声明一个未命名的分类接口,使reduce方法私有化(即外部无法访问).
  5. // 1) 可以通过定义额外的实例变量和属性来扩展类,这在有命名的分类中是不允许的。
  6. // 2) 未命名分类中声明的方法需要在主实现区域实现,而不是在分离的实现区域中实现。
  7. // 3) 未命名分类中的方法都是私有的。
  8. // 4) 分类可以覆盖该类中的另一个方法(通常认为这种做法是拙劣的设计习惯)
  9. /*
  10. @interface Fraction ()
  11. -(void) reduce;
  12. @end
  13. */
  14.  
  15. @implementation Fraction
  16.  
  17. @synthesize numerator, denominator;
  18.  
  19. // 用静态变量记录创建了多少个Fraction对象
  20. // 静态变量不能被文件以外的代码访问
  21. static int gCounter;
  22.  
  23. -(void) print
  24. {
  25. NSLog(@"%i/%i", numerator, denominator);
  26. }
  27.  
  28. // 多个参数的方法
  29. -(void) setTo: (int) n over: (int) d
  30. {
  31. numerator = n;
  32. denominator = d;
  33. }
  34.  
  35. -(double) convertToNum
  36. {
  37. if (denominator != 0)
  38. return (double) numerator / denominator;
  39. else
  40. return NAN;
  41. }
  42.  
  43. // 省略参数名的多个参数方法
  44. // 注意,第一个参数名不能省
  45. // 省略参数名不是一种好的编程风格,因为它使程序很难读懂并且很不直观,特别是参数很重要时。
  46. -(void) set: (int) n : (int) d
  47. {
  48. numerator = n;
  49. denominator = d;
  50. }
  51.  
  52. // 约分
  53. -(void) reduce
  54. {
  55. int u = numerator;
  56. int v = denominator;
  57. int temp;
  58. while (v != 0) {
  59. temp = u % v;
  60. u = v;
  61. v = temp;
  62. }
  63. numerator /= u;
  64. denominator /= u;
  65. }
  66.  
  67. +(Fraction *) allocF;
  68. {
  69. // 可以省略extern声明,写上也不会错
  70. //extern int gCounter;
  71. ++gCounter;
  72. return [Fraction alloc];
  73. }
  74.  
  75. +(int) count
  76. {
  77. //extern int gCounter;
  78. return gCounter;
  79. }
  80.  
  81. @end


FractionMathOps.m

  1. // Fraction.m 分类实现
  2. #import "FractionMathOps.h"
  3.  
  4. @implementation Fraction (MathOps)
  5.  
  6. // 两个分数加相
  7. -(Fraction *) add: (Fraction *) f
  8. {
  9. // 添加两个分数
  10. // a/b+c/d=((a*d)+(b*c))/(b*d)
  11. // 创建一个新对象来存储结果
  12. Fraction *result = [[Fraction alloc] init];
  13. result.numerator = self.numerator * f.denominator + self.denominator * f.numerator;
  14. result.denominator = self.denominator * f.denominator;
  15. [result reduce];
  16. return result;
  17. }
  18.  
  19. // 两个分数相乘
  20. -(Fraction *) mul: (Fraction *) f
  21. {
  22. Fraction *result = [[Fraction alloc] init];
  23. result.numerator = self.numerator * f.numerator ;
  24. result.denominator = self.denominator * f.denominator;
  25. [result reduce];
  26. return result;
  27. }
  28.  
  29. // 两个分数相减
  30. -(Fraction *) sub: (Fraction *) f
  31. {
  32. Fraction *result = [[Fraction alloc] init];
  33. result.numerator = self.numerator * f.denominator - self.denominator * f.numerator;
  34. result.denominator = self.denominator * f.denominator;
  35. [result reduce];
  36. return result;
  37. }
  38.  
  39. // 两个分数相除
  40. -(Fraction *) div: (Fraction *) f
  41. {
  42. Fraction *result = [[Fraction alloc] init];
  43. result.numerator = self.numerator * f.denominator;
  44. result.denominator = self.denominator * f.numerator;
  45. [result reduce];
  46. return result;
  47. }
  48.  
  49. @end


main.m

  1. #import <Foundation/Foundation.h>
  2. #import "FractionMathOps.h"
  3.  
  4. int main(int argc, const char * argv[]) {
  5. @autoreleasepool {
  6. Fraction *a = [[Fraction alloc] init];
  7. Fraction *b = [[Fraction alloc] init];
  8. Fraction *result;
  9. [a setTo: 1 over: 3];
  10. [b setTo: 2 over: 5];
  11. // 加
  12. [a print]; NSLog(@" +"); [b print]; NSLog(@"-----");
  13. result = [a add: b];
  14. [result print];
  15. NSLog(@"\n");
  16. // 减
  17. [a print]; NSLog(@" -"); [b print]; NSLog(@"-----");
  18. result = [a sub: b];
  19. [result print];
  20. NSLog(@"\n");
  21. // 乘
  22. [a print]; NSLog(@" *"); [b print]; NSLog(@"-----");
  23. result = [a mul: b];
  24. [result print];
  25. NSLog(@"\n");
  26. // 除
  27. [a print]; NSLog(@" /"); [b print]; NSLog(@"-----");
  28. result = [a div: b];
  29. [result print];
  30. NSLog(@"\n");
  31. }
  32. return 0;
  33. }

运行测试
444.png

标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号