Thứ Sáu, 28 tháng 6, 2013

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

-          ́ thừa từ các giao thức khác :
@protocol MyProtocol <NSObject>
...
@end

@interface MyClass : NSObject <MyProtocol, AnotherProtocol, YetAnotherProtocol>
...

Không có nhận xét nào:

Đăng nhận xét