Objective-C วัตถุผสม
เราสามารถสร้างคลาสย่อยภายในคลัสเตอร์คลาสที่กำหนดคลาสที่ฝังอ็อบเจ็กต์ไว้ภายในคลาสนั้น คลาสอ็อบเจ็กต์เหล่านี้เป็นอ็อบเจ็กต์คอมโพสิต ดังนั้นคุณอาจสงสัยว่าคลัสเตอร์คลาสคืออะไร ก่อนอื่นเราจะดูว่าคลัสเตอร์คลาสคืออะไร
กลุ่มคลาส
คลัสเตอร์ชั้นเรียนเป็นรูปแบบการออกแบบที่กรอบงานพื้นฐานใช้ประโยชน์ได้อย่างกว้างขวาง คลัสเตอร์คลาสจัดกลุ่มคลาสย่อยคอนกรีตส่วนตัวจำนวนหนึ่งภายใต้คลาสซูเปอร์นามธรรมสาธารณะ การจัดกลุ่มคลาสด้วยวิธีนี้ช่วยลดความซับซ้อนของสถาปัตยกรรมที่เปิดเผยต่อสาธารณะของเฟรมเวิร์กเชิงวัตถุโดยไม่ลดความสมบูรณ์ของฟังก์ชัน คลัสเตอร์ของคลาสจะขึ้นอยู่กับabstract factory รูปแบบการออกแบบ.
เพื่อให้ง่ายแทนที่จะสร้างหลายคลาสสำหรับฟังก์ชันที่คล้ายกันเราจะสร้างคลาสเดียวที่จะดูแลการจัดการตามค่าของอินพุต
ตัวอย่างเช่นใน NSNumber เรามีกลุ่มคลาสมากมายเช่น char, int, bool และอื่น ๆ เราจัดกลุ่มทั้งหมดเป็นคลาสเดียวที่ดูแลจัดการการดำเนินการที่คล้ายกันในคลาสเดียว NSNumber รวมค่าของชนิดดั้งเดิมเหล่านี้ไว้ในวัตถุ
วัตถุประกอบคืออะไร?
ด้วยการฝังวัตถุคลัสเตอร์ส่วนตัวในวัตถุที่เราออกแบบเองเราจะสร้างวัตถุผสม อ็อบเจ็กต์คอมโพสิตนี้สามารถใช้อ็อบเจ็กต์คลัสเตอร์สำหรับการทำงานพื้นฐานโดยสกัดกั้นข้อความที่อ็อบเจ็กต์คอมโพสิตต้องการจัดการในลักษณะเฉพาะ สถาปัตยกรรมนี้ช่วยลดจำนวนโค้ดที่เราต้องเขียนและช่วยให้คุณใช้ประโยชน์จากโค้ดที่ทดสอบโดย Foundation Framework ได้
นี่คือคำอธิบายในรูปต่อไปนี้
อ็อบเจ็กต์คอมโพสิตต้องประกาศตัวเองว่าเป็นคลาสย่อยของคลาสนามธรรมของคลัสเตอร์ ในฐานะคลาสย่อยจะต้องลบล้างเมธอดดั้งเดิมของซูเปอร์คลาส นอกจากนี้ยังสามารถแทนที่วิธีการที่ได้รับ แต่ไม่จำเป็นเนื่องจากวิธีการที่ได้รับนั้นทำงานผ่านวิธีดั้งเดิม
วิธีการนับของคลาส NSArray เป็นตัวอย่าง การดำเนินการของวัตถุที่แทรกแซงวิธีการที่มันแทนที่สามารถทำได้ง่ายเพียง -
- (unsigned)count {
return [embeddedObject count];
}
ในตัวอย่างข้างต้นวัตถุฝังตัวเป็นประเภท NSArray
ตัวอย่างวัตถุผสม
ตอนนี้เพื่อดูตัวอย่างที่สมบูรณ์ลองดูตัวอย่างจากเอกสารของ Apple ที่ให้ไว้ด้านล่าง
#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;
}
ตอนนี้เมื่อเราคอมไพล์และรันโปรแกรมเราจะได้ผลลัพธ์ดังต่อไปนี้
2013-09-28 22:03:54.294 demo[6247] The value at Index 1 is Object2
ในตัวอย่างข้างต้นเราจะเห็นว่าการตรวจสอบความถูกต้องของฟังก์ชันหนึ่งของอาร์เรย์จะไม่อนุญาตให้เพิ่มวัตถุว่างที่จะนำไปสู่ความผิดพลาดในสถานการณ์ปกติ แต่อาร์เรย์ที่ตรวจสอบความถูกต้องของเราจะดูแลมัน ในทำนองเดียวกันแต่ละวิธีในการตรวจสอบความถูกต้องอาร์เรย์จะเพิ่มกระบวนการตรวจสอบความถูกต้องนอกเหนือจากลำดับการดำเนินการตามปกติ