Objective-C Dinamik Bağlama
Dinamik bağlama, derleme zamanında yerine çalışma zamanında çağrılacak yöntemi belirlemektir. Dinamik bağlanmaya ayrıca geç bağlanma adı verilir. Objective-C'de, tüm yöntemler çalışma zamanında dinamik olarak çözümlenir. Yürütülen tam kod, hem yöntem adı (seçici) hem de alan nesne tarafından belirlenir.
Dinamik bağlama, polimorfizmi mümkün kılar. Örneğin, Dikdörtgen ve Kare gibi bir nesne koleksiyonunu düşünün. Her nesnenin kendi printArea yöntemi uygulaması vardır.
Aşağıdaki kod parçasında, [anObject printArea] ifadesi tarafından yürütülmesi gereken gerçek kod çalışma zamanında belirlenir. Çalışma zamanı sistemi, birObject sınıfının hangi sınıfta olursa olsun uygun yöntemi tanımlamak için çalıştırılan yöntem için seçiciyi kullanır.
Dinamik bağlamayı açıklayacak basit bir koda bakalım.
#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;
}
Şimdi programı derleyip çalıştırdığımızda aşağıdaki sonucu alacağız.
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
Yukarıdaki örnekte görebileceğiniz gibi, printArea yöntemi çalışma zamanında dinamik olarak seçilir. Dinamik bağlama için bir örnektir ve benzer türdeki nesnelerle uğraşırken birçok durumda oldukça kullanışlıdır.