LẬP TRÌNH OBJECTIVE-C - part 4
5.
Categories,
Protocols, Delegate
a. Categories
- Là đặc điểm nếu bạn muốn mở rộng lớp bằng cách thêm mới vào lớp một
phương thức. Khi bạn làm việc quen với OOP thì bạn sẽ thấy đây là một trong những
thuộc tính vô cùng hữu ích của Objective C, kể cả ngay khi bạn không có mã nguồn
của lớp nhưng bạn vẫn hoàn toàn có thể thêm phương thức cho lớp như thường
thông qua thuộc tính này. Đặc điểm này làm giảm đi đáng kể sự kế thừa phức tạp
trong C++ khi việc kế thừa chỉ để phục vụ cho việc thêm mới một phương thức. Mặt
khăc việc chia mã nguồn trên nhiều files cũng giúp ích đáng kể trong việc phát
triển.
- Tên của category phải là duy nhất
- Có thể thêm bao nhiêu lần mở rộng lơp từ category là không giới hạn
nhưng với tên là duy nhất.
- Thông thể bổ xung biến thành phần bằng category.
- Có thể sử dụng category để tạo ra các phương thức private. Nếu cần.
- Cú pháp:
@interface ClassToAddMethodsTo (category)
//methods go here
@end
- Ví dụ như :
@interface NSString (reverse)
-(NSString *) reverseString;
@end
@implementation NSString (reverse)
-(NSString *) reverseString {
NSMutableString *reversedStr;
int len = [self length];
// Auto released string
reversedStr = [NSMutableString
stringWithCapacity:len];
// Probably woefully
inefficient...
while (len > 0)
[reversedStr appendString:
[NSString
stringWithFormat:@"%C", [self characterAtIndex:--len]]];
return reversedStr;
}
@end
#import <Foundation/Foundation.h>
#import "NSString+Reverse.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool =
[[NSAutoreleasePool alloc] init];
NSString *str = [NSString
stringWithString:@"Fubar"];
NSString *rev;
NSLog(@"String: %@",
str);
rev = [str reverseString];
NSLog(@"Reversed:
%@",rev);
[pool drain];
return 0;
}
Kết quả :
b. Frotocols (giao thức)
-
Objective-C cho phép bạn xác định các giao thức, thực hiện
các kê khai các method dự kiến sẽ được sử dụng cho một tình huống
cụ thể.
-
Một lớp giao diện khai báo cáo các hàm (methods) và các
thuộc tính (proproties) thì gắn liền với lớp đó. Còn với một giao
thức, thì ngược lại sử dụng để khai báo các method và properties độc
lập với bất lớp nào khác.
-
Tất cả các class trong giao thức đều là required methods.
-
Cú pháp :
@protocol ProtocolName
// list of methods and properties
@end
-
Giao thức bao gồm cả method, thuộc tính
-
Ví dụ trên developer.apple.com
Đây là về
biểu đồ hình tròn: gồm 3 thuộc tính :
@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
- (BOOL)shouldExplodeSegmentAtIndex:(NSUInteger)segmentIndex;
@required
- (UIColor *)colorForSegmentAtIndex:(NSUInteger)segmentIndex;
@end
Gọi giao thức
@interface XYZPieChartView : UIView
@property (weak) id <XYZPieChartViewDataSource> dataSource;
@end
-
Kế thừa từ các giao thức khác :
@protocol MyProtocol <NSObject>
...
@end
@interface MyClass : NSObject <MyProtocol, AnotherProtocol,
YetAnotherProtocol>
...