Đối tượng tổng hợp Objective-C
Chúng ta có thể tạo lớp con bên trong một cụm lớp xác định một lớp nhúng bên trong nó một đối tượng. Các đối tượng lớp này là các đối tượng hỗn hợp. Vì vậy, bạn có thể tự hỏi một cụm lớp là gì. Vì vậy, trước tiên chúng ta sẽ xem một cụm lớp là gì.
Nhóm lớp
Các cụm lớp là một mẫu thiết kế mà khung nền tảng sử dụng rộng rãi. Các cụm lớp nhóm một số lớp con cụ thể riêng dưới một lớp cha trừu tượng công khai. Việc nhóm các lớp theo cách này đơn giản hóa kiến trúc hiển thị công khai của khung hướng đối tượng mà không làm giảm tính phong phú về chức năng của nó. Các cụm lớp dựa trênabstract factory mẫu thiết kế.
Để đơn giản hơn, thay vì tạo nhiều lớp cho các chức năng tương tự, chúng ta tạo một lớp duy nhất sẽ đảm nhận việc xử lý nó dựa trên giá trị của đầu vào.
Ví dụ, trong NSNumber, chúng ta có nhiều cụm lớp như char, int, bool, v.v. Chúng tôi nhóm tất cả chúng vào một lớp duy nhất để xử lý các hoạt động tương tự trong một lớp duy nhất. NSNumber thực sự bao bọc giá trị của các kiểu nguyên thủy này vào các đối tượng.
Đối tượng tổng hợp là gì?
Bằng cách nhúng một đối tượng cụm riêng vào một đối tượng do chính chúng tôi thiết kế, chúng tôi tạo ra một đối tượng tổng hợp. Đối tượng tổng hợp này có thể dựa vào đối tượng cụm cho chức năng cơ bản của nó, chỉ chặn các thông báo mà đối tượng kết hợp muốn xử lý theo một số cách cụ thể. Kiến trúc này làm giảm số lượng mã chúng ta phải viết và cho phép bạn tận dụng mã đã thử nghiệm do Foundation Framework cung cấp.
Điều này được giải thích trong hình sau.
Đối tượng kết hợp phải tự khai báo là một lớp con của lớp cha trừu tượng của cụm. Là một lớp con, nó phải ghi đè các phương thức nguyên thủy của lớp cha. Nó cũng có thể ghi đè các phương thức dẫn xuất, nhưng điều này không cần thiết vì các phương thức dẫn xuất hoạt động thông qua các phương thức nguyên thủy.
Phương thức đếm của lớp NSArray là một ví dụ; việc thực hiện của đối tượng can thiệp của một phương thức mà nó ghi đè có thể đơn giản như:
- (unsigned)count {
return [embeddedObject count];
}
Trong ví dụ trên, đối tượng nhúng thực sự thuộc loại NSArray.
Ví dụ về đối tượng kết hợp
Bây giờ để xem một ví dụ hoàn chỉnh, hãy xem ví dụ từ tài liệu của Apple được đưa ra bên dưới.
#import <Foundation/Foundation.h>
@interface ValidatingArray : NSMutableArray {
NSMutableArray *embeddedArray;
}
+ validatingArray;
- init;
- (unsigned)count;
- objectAtIndex:(unsigned)index;
- (void)addObject:object;
- (void)replaceObjectAtIndex:(unsigned)index withObject:object;
- (void)removeLastObject;
- (void)insertObject:object atIndex:(unsigned)index;
- (void)removeObjectAtIndex:(unsigned)index;
@end
@implementation ValidatingArray
- init {
self = [super init];
if (self) {
embeddedArray = [[NSMutableArray allocWithZone:[self zone]] init];
}
return self;
}
+ validatingArray {
return [[self alloc] init] ;
}
- (unsigned)count {
return [embeddedArray count];
}
- objectAtIndex:(unsigned)index {
return [embeddedArray objectAtIndex:index];
}
- (void)addObject:(id)object {
if (object != nil) {
[embeddedArray addObject:object];
}
}
- (void)replaceObjectAtIndex:(unsigned)index withObject:(id)object; {
if (index <[embeddedArray count] && object != nil) {
[embeddedArray replaceObjectAtIndex:index withObject:object];
}
}
- (void)removeLastObject; {
if ([embeddedArray count] > 0) {
[embeddedArray removeLastObject];
}
}
- (void)insertObject:(id)object atIndex:(unsigned)index; {
if (object != nil) {
[embeddedArray insertObject:object atIndex:index];
}
}
- (void)removeObjectAtIndex:(unsigned)index; {
if (index <[embeddedArray count]) {
[embeddedArray removeObjectAtIndex:index];
}
}
@end
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
ValidatingArray *validatingArray = [ValidatingArray validatingArray];
[validatingArray addObject:@"Object1"];
[validatingArray addObject:@"Object2"];
[validatingArray addObject:[NSNull null]];
[validatingArray removeObjectAtIndex:2];
NSString *aString = [validatingArray objectAtIndex:1];
NSLog(@"The value at Index 1 is %@",aString);
[pool drain];
return 0;
}
Bây giờ khi chúng ta biên dịch và chạy chương trình, chúng ta sẽ nhận được kết quả như sau.
2013-09-28 22:03:54.294 demo[6247] The value at Index 1 is Object2
Trong ví dụ trên, chúng ta có thể thấy rằng việc xác thực một hàm của mảng sẽ không cho phép thêm các đối tượng null sẽ dẫn đến sự cố trong trường hợp bình thường. Nhưng mảng xác thực của chúng tôi sẽ chăm sóc nó. Tương tự, mỗi phương thức trong mảng xác thực bổ sung các quy trình xác thực ngoài chuỗi hoạt động bình thường.