Objective-C 多态(Polymorphism)

多态性(polymorphism)一词意味着有多种形式。通常,当存在类的层次结构并且它们通过继承相关联时,就会发生多态。

Objective-C 多态性意味着对成员函数的调用将导致根据调用函数的对象类型执行不同的函数。

考虑这个例子,我们有一个类 Shape,它为所有形状提供了基本接口。Square 正方形和 Rectangle 矩形是从基类形状派生的。

我们有一个方法 printArea,它将展示 OOP 的多态性

  1. #import <Foundation/Foundation.h>
  2. @interface Shape : NSObject {
  3. CGFloat area;
  4. }
  5. - (void)printArea;
  6. - (void)calculateArea;
  7. @end
  8. @implementation Shape
  9. - (void)printArea {
  10. NSLog(@"The area is %f", area);
  11. }
  12. - (void)calculateArea {
  13. }
  14. @end
  15. @interface Square : Shape {
  16. CGFloat length;
  17. }
  18. - (id)initWithSide:(CGFloat)side;
  19. - (void)calculateArea;
  20. @end
  21. @implementation Square
  22. - (id)initWithSide:(CGFloat)side {
  23. length = side;
  24. return self;
  25. }
  26. - (void)calculateArea {
  27. area = length * length;
  28. }
  29. - (void)printArea {
  30. NSLog(@"The area of square is %f", area);
  31. }
  32. @end
  33. @interface Rectangle : Shape {
  34. CGFloat length;
  35. CGFloat breadth;
  36. }
  37. - (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth;
  38. @end
  39. @implementation Rectangle
  40. - (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth {
  41. length = rLength;
  42. breadth = rBreadth;
  43. return self;
  44. }
  45. - (void)calculateArea {
  46. area = length * breadth;
  47. }
  48. @end
  49. int main(int argc, const char * argv[]) {
  50. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  51. Shape *square = [[Square alloc]initWithSide:10.0];
  52. [square calculateArea];
  53. [square printArea];
  54. Shape *rect = [[Rectangle alloc]
  55. initWithLength:10.0 andBreadth:5.0];
  56. [rect calculateArea];
  57. [rect printArea];
  58. [pool drain];
  59. return 0;
  60. }

结果如下:

  1. 2022-07-07 21:21:50.785 Polymorphism[358:303] The area of square is 100.000000
  2. 2022-07-07 21:21:50.786 Polymorphism[358:303] The area is 50.000000

在上面的实例中,基于方法 calculateAreaprintArea 的可用性,执行基类或派生类中的方法。

多态性处理基于基类和派生类的方法实现的方法之间的切换。