Dynamiczne wiązanie celu-C
Dynamiczne powiązanie określa metodę wywołania w czasie wykonywania, a nie w czasie kompilacji. Dynamiczne wiązanie jest również nazywane późnym wiązaniem. W Objective-C wszystkie metody są rozwiązywane dynamicznie w czasie wykonywania. Dokładny wykonywany kod jest określany zarówno przez nazwę metody (selektor), jak i przez obiekt odbierający.
Dynamiczne wiązanie umożliwia polimorfizm. Na przykład rozważmy zbiór obiektów, w tym Rectangle i Square. Każdy obiekt ma własną implementację metody printArea.
W poniższym fragmencie kodu rzeczywisty kod, który powinien zostać wykonany przez wyrażenie [anObject printArea], jest określany w czasie wykonywania. System runtime używa selektora dla metody run, aby zidentyfikować odpowiednią metodę w dowolnej klasie obiektu anObject.
Przyjrzyjmy się prostemu kodowi, który wyjaśniłby dynamiczne wiązanie.
#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;
}
Teraz, kiedy kompilujemy i uruchamiamy program, otrzymamy następujący wynik.
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
Jak widać na powyższym przykładzie, metoda printArea jest wybierana dynamicznie w czasie wykonywania. Jest to przykład dynamicznego wiązania i jest bardzo przydatny w wielu sytuacjach, gdy mamy do czynienia z podobnymi obiektami.