Objective-C 복합 객체

객체를 포함하는 클래스를 정의하는 클래스 클러스터 내에 하위 클래스를 만들 수 있습니다. 이러한 클래스 개체는 복합 개체입니다. 따라서 클래스 클러스터가 무엇인지 궁금 할 수 있습니다. 따라서 먼저 클래스 클러스터가 무엇인지 살펴 보겠습니다.

클래스 클러스터

클래스 클러스터는 기초 프레임 워크가 광범위하게 사용하는 디자인 패턴입니다. 클래스 클러스터는 공용 추상 슈퍼 클래스 아래에 여러 개인용 구체적인 하위 클래스를 그룹화합니다. 이러한 방식으로 클래스를 그룹화하면 기능적 풍부함을 줄이지 않고 객체 지향 프레임 워크의 공개적으로 볼 수있는 아키텍처가 단순화됩니다. 클래스 클러스터는abstract factory 디자인 패턴.

간단하게하기 위해 유사한 함수에 대해 여러 클래스를 만드는 대신 입력 값에 따라 처리를 처리하는 단일 클래스를 만듭니다.

예를 들어, NSNumber에는 char, int, bool 등과 같은 많은 클래스 클러스터가 있습니다. 우리는 그것들을 모두 단일 클래스에서 유사한 작업을 처리하는 단일 클래스로 그룹화합니다. NSNumber는 실제로 이러한 기본 유형의 값을 객체로 래핑합니다.

복합 개체 란 무엇입니까?

자체 디자인의 개체에 개인 클러스터 개체를 포함하여 복합 개체를 만듭니다. 이 복합 개체는 기본 기능을 위해 클러스터 개체에 의존 할 수 있으며 복합 개체가 특정 방식으로 처리하려는 메시지 만 가로 챌 수 있습니다. 이 아키텍처는 작성해야하는 코드의 양을 줄이고 Foundation Framework에서 제공하는 테스트 된 코드를 활용할 수 있도록합니다.

이것은 다음 그림에 설명되어 있습니다.

복합 객체는 자신을 클러스터의 추상 수퍼 클래스의 하위 클래스로 선언해야합니다. 서브 클래스로서 수퍼 클래스의 기본 메소드를 재정의해야합니다. 파생 메서드를 재정의 할 수도 있지만 파생 메서드가 기본 메서드를 통해 작동하므로 필요하지 않습니다.

NSArray 클래스의 count 메소드는 예입니다. 그것이 재정의하는 메서드의 중간 개체의 구현은 다음과 같이 간단 할 수 있습니다.

- (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

위의 예에서 배열의 하나의 함수를 확인하면 정상적인 시나리오에서 충돌을 일으킬 수있는 null 개체를 추가 할 수 없음을 알 수 있습니다. 그러나 유효성 검사 어레이가 처리합니다. 마찬가지로 배열 유효성 검사의 각 방법은 정상적인 작업 순서와 별도로 유효성 검사 프로세스를 추가합니다.