Objective-C Dynamische Bindung
Die dynamische Bindung bestimmt die Methode, die zur Laufzeit anstatt zur Kompilierungszeit aufgerufen werden soll. Dynamische Bindung wird auch als späte Bindung bezeichnet. In Objective-C werden alle Methoden zur Laufzeit dynamisch aufgelöst. Der genaue ausgeführte Code wird sowohl vom Methodennamen (dem Selektor) als auch vom empfangenden Objekt bestimmt.
Dynamische Bindung ermöglicht Polymorphismus. Betrachten Sie beispielsweise eine Sammlung von Objekten, einschließlich Rechteck und Quadrat. Jedes Objekt verfügt über eine eigene Implementierung einer printArea-Methode.
Im folgenden Codefragment wird zur Laufzeit der tatsächliche Code bestimmt, der vom Ausdruck [anObject printArea] ausgeführt werden soll. Das Laufzeitsystem verwendet den Selektor für den Methodenlauf, um die entsprechende Methode in der Klasse von anObject zu identifizieren, die sich als solche herausstellt.
Schauen wir uns einen einfachen Code an, der die dynamische Bindung erklärt.
#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;
}
Wenn wir nun das Programm kompilieren und ausführen, erhalten wir das folgende Ergebnis.
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
Wie Sie im obigen Beispiel sehen können, wird die printArea-Methode zur Laufzeit dynamisch ausgewählt. Es ist ein Beispiel für die dynamische Bindung und in vielen Situationen sehr nützlich, wenn es um ähnliche Objekte geht.