Составные объекты Objective-C
Мы можем создать подкласс в кластере классов, который определяет класс, который включает в себя объект. Эти объекты класса являются составными объектами. Итак, вам может быть интересно, что такое кластер классов. Итак, сначала мы увидим, что такое кластер классов.
Кластеры классов
Кластеры классов - это шаблон проектирования, который широко используется в базовой структуре. Кластеры классов группируют ряд частных конкретных подклассов в рамках общедоступного абстрактного суперкласса. Группировка классов таким образом упрощает общедоступную архитектуру объектно-ориентированной структуры без снижения ее функционального разнообразия. Кластеры классов основаны наabstract factory шаблон дизайна.
Чтобы упростить задачу, вместо того, чтобы создавать несколько классов для похожих функций, мы создаем один класс, который будет заботиться о его обработке в зависимости от значения ввода.
Например, в NSNumber у нас есть много кластеров классов, таких как char, int, bool и так далее. Мы группируем их все в один класс, который выполняет аналогичные операции в одном классе. NSNumber фактически оборачивает значение этих примитивных типов в объекты.
Что такое составной объект?
Встраивая частный объект кластера в объект собственной разработки, мы создаем составной объект. Этот составной объект может полагаться на объект кластера для выполнения своих основных функций, только перехватывая сообщения, которые составной объект хочет обработать определенным образом. Эта архитектура сокращает объем кода, который мы должны написать, и позволяет вам воспользоваться преимуществами протестированного кода, предоставляемого Foundation Framework.
Это поясняется на следующем рисунке.
Составной объект должен объявить себя подклассом абстрактного суперкласса кластера. Как подкласс, он должен переопределять примитивные методы суперкласса. Он также может переопределять производные методы, но в этом нет необходимости, поскольку производные методы работают через примитивные.
Примером является метод count класса 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
В приведенном выше примере мы видим, что проверка одной функции массива не позволит добавить нулевые объекты, что приведет к сбою в обычном сценарии. Но наш проверяющий массив позаботится об этом. Точно так же каждый метод в проверяющем массиве добавляет проверочные процессы помимо обычной последовательности операций.