多态性这个词表示有许多形式。 通常,当存在类的层次结构并且通过继承相关时,会发生多态性。
Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型。
考虑下面一个例子,有一个基类Shape
类,它为所有形状提供基本接口。 Square
和Rectangle
类派生自基Shape
类。
下面使用printArea
方法来展示OOP特征多态性。
#import <Foundation/Foundation.h> @interface Shape : NSObject { CGFloat area; } - (void)printArea; - (void)calculateArea; @end @implementation Shape - (void)printArea { NSLog(@"The area is %f", area); } - (void)calculateArea { } @end @interface Square : Shape { CGFloat length; } - (id)initWithSide:(CGFloat)side; - (void)calculateArea; @end @implementation Square - (id)initWithSide:(CGFloat)side { length = side; return self; } - (void)calculateArea { area = length * length; } - (void)printArea { NSLog(@"The area of square is %f", area); } @end @interface Rectangle : Shape { CGFloat length; CGFloat breadth; } - (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth; @end @implementation Rectangle - (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth { length = rLength; breadth = rBreadth; return self; } - (void)calculateArea { area = length * breadth; } @end int main(int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Shape *square = [[Square alloc]initWithSide:10.0]; [square calculateArea]; [square printArea]; Shape *rect = [[Rectangle alloc] initWithLength:10.0 andBreadth:5.0]; [rect calculateArea]; [rect printArea]; [pool drain]; return 0; }
执行上面示例代码,得到以下结果 -
2018-11-16 02:02:22.096 main[159689] The area of square is 100.000000 2018-11-16 02:02:22.098 main[159689] The area is 50.000000
在上面的示例中,calculateArea
和printArea
方法的可用性,无论是基类中的方法还是执行派生类。
多态性基于两个类的方法实现来处理基类和派生类之间的方法切换。