Liên kết động Objective-C

Liên kết động là xác định phương thức để gọi lúc chạy thay vì lúc biên dịch. Ràng buộc động còn được gọi là ràng buộc muộn. Trong Objective-C, tất cả các phương thức được giải quyết động trong thời gian chạy. Mã chính xác được thực thi được xác định bởi cả tên phương thức (bộ chọn) và đối tượng nhận.

Liên kết động cho phép đa hình. Ví dụ, hãy xem xét một tập hợp các đối tượng bao gồm Hình chữ nhật và Hình vuông. Mỗi đối tượng có một phương thức printArea triển khai riêng.

Trong đoạn mã sau, mã thực sẽ được thực thi bởi biểu thức [anObject printArea] được xác định trong thời gian chạy. Hệ thống thời gian chạy sử dụng bộ chọn cho phương thức chạy để xác định phương thức thích hợp trong bất kỳ lớp nào của anObject.

Hãy để chúng tôi xem xét một mã đơn giản sẽ giải thích ràng buộc động.

#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;
}

Bây giờ khi chúng ta biên dịch và chạy chương trình, chúng ta sẽ nhận được kết quả như sau.

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

Như bạn có thể thấy trong ví dụ trên, phương thức printArea được chọn động trong thời gian chạy. Nó là một ví dụ cho ràng buộc động và khá hữu ích trong nhiều tình huống khi xử lý các loại đối tượng tương tự.