Objective-C динамическое связывание
Динамическое связывание определяет метод, вызываемый во время выполнения, а не во время компиляции. Динамическое связывание также называется поздним связыванием. В Objective-C все методы разрешаются динамически во время выполнения. Точный выполняемый код определяется как именем метода (селектор), так и получающим объектом.
Динамическое связывание допускает полиморфизм. Например, рассмотрим набор объектов, включая прямоугольник и квадрат. Каждый объект имеет собственную реализацию метода printArea.
В следующем фрагменте кода фактический код, который должен выполняться выражением [anObject printArea], определяется во время выполнения. Система времени выполнения использует селектор для запуска метода, чтобы идентифицировать соответствующий метод в каком бы классе объекта ни оказался.
Давайте посмотрим на простой код, объясняющий динамическое связывание.
#import <Foundation/Foundation.h>
@interface Square:NSObject {
float area;
}
- (void)calculateAreaOfSide:(CGFloat)side;
- (void)printArea;
@end
@implementation Square
- (void)calculateAreaOfSide:(CGFloat)side {
area = side * side;
}
- (void)printArea {
NSLog(@"The area of square is %f",area);
}
@end
@interface Rectangle:NSObject {
float area;
}
- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
- (void)printArea;
@end
@implementation Rectangle
- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth {
area = length * breadth;
}
- (void)printArea {
NSLog(@"The area of Rectangle is %f",area);
}
@end
int main() {
Square *square = [[Square alloc]init];
[square calculateAreaOfSide:10.0];
Rectangle *rectangle = [[Rectangle alloc]init];
[rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
id object1 = [shapes objectAtIndex:0];
[object1 printArea];
id object2 = [shapes objectAtIndex:1];
[object2 printArea];
return 0;
}
Теперь, когда мы скомпилируем и запустим программу, мы получим следующий результат.
2013-09-28 07:42:29.821 demo[4916] The area of square is 100.000000
2013-09-28 07:42:29.821 demo[4916] The area of Rectangle is 50.000000
Как вы можете видеть в приведенном выше примере, метод printArea динамически выбирается во время выполнения. Это пример динамического связывания, который весьма полезен во многих ситуациях при работе с объектами аналогичного типа.