Objective-C動態系結


動態系結確定在執行時而不是在編譯時呼叫的方法。 動態系結也稱為後期系結。 在Objective-C中,所有方法都在執行時動態解析。執行的確切程式碼由方法名稱(選擇器)和接收物件確定。

動態系結可實現多型性。例如,考慮一組物件,包括RectangleSquare。 每個物件都有自己的printArea方法實現。

在下面的程式碼片段中,表示式[anObject printArea]執行的實際程式碼是在執行時確定的。 執行時系統使用方法執行的選擇器來識別anObject的任何類中的適當方法。

下面來看一下解釋動態系結的簡單程式碼 -

#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:8.0];

   Rectangle *rectangle = [[Rectangle alloc]init];
   [rectangle calculateAreaOfLength:10.0 andBreadth:20.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;
}

執行上面範例程式碼,得到以下結果 -

2018-11-16 03:16:53.399 main[53860] The area of square is 64.000000
2018-11-16 03:16:53.401 main[53860] The area of Rectangle is 200.000000

正如在上面的範例中所看到的,printArea方法是在執行時動態選擇呼叫的。 它是動態系結的一個範例,在處理類似物件時在很多情況下非常有用。