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

ในตัวอย่างข้างต้นเราจะเห็นว่าการตรวจสอบความถูกต้องของฟังก์ชันหนึ่งของอาร์เรย์จะไม่อนุญาตให้เพิ่มวัตถุว่างที่จะนำไปสู่ความผิดพลาดในสถานการณ์ปกติ แต่อาร์เรย์ที่ตรวจสอบความถูกต้องของเราจะดูแลมัน ในทำนองเดียวกันแต่ละวิธีในการตรวจสอบความถูกต้องอาร์เรย์จะเพิ่มกระบวนการตรวจสอบความถูกต้องนอกเหนือจากลำดับการดำเนินการตามปกติ