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.