Подклассы в Objective-C - PullRequest
       6

Подклассы в Objective-C

0 голосов
/ 24 декабря 2010

Я немного новичок в Objective-C, и я пытался сделать что-то, что явно не разрешено, хотя это обычная практика на других языках (я думаю).

КакВ конкретном примере я хочу создать подкласс NSMutableArray, чтобы получить SortedMutableArray, который всегда поддерживает себя в отсортированном состоянии.Поэтому я подклассифицировал NSMutableArray обычным способом, добавив свойство NSComparator, которое определяет порядок сортировки.Я переопределил метод addObject: для вставки объектов отсортированным образом:

- (void) addObject:(id)anObject {
    for (int i = 0; i < [self count]; ++i) {
        NSComparisonResult result = (NSComparisonResult)self.comparator([self objectAtIndex:i], anObject); 
        if (result == NSOrderedDescending || result == NSOrderedSame) {
            [super insertObject:anObject atIndex:i];
            break;
        }
        else {
            if (result != NSOrderedAscending) {
                [NSException raise:@"InvalidBlockException" format:@"Block must return one of NSOrderedDescending, NSOrderedAscending, or NSOrderedSame"];
            }
        }
    }
}

, и все прекрасно скомпилируется.Но когда я запускаю программу, я получаю сообщение об ошибке, указывающее, что insertObject:atIndex: теперь является абстрактным и должен быть реализован.Читая документацию, он перечисляет несколько методов, которые должны быть реализованы в любом подклассе NSMutableArray, один из которых действительно insertObject:atIndex:.Но мне не нужно менять функциональность insertObject:atIndex:;Я хочу сказать это точно так же, как и в NSMutableArray.Есть ли способ, которым я могу сделать это (в общем, тоже, не только для этой конкретной проблемы)?Почему определенные методы должны быть реализованы в подклассах, как это?Разве такое поражение не является одной из целей наследования, повторного использования кода?Я никогда не видел ничего подобного в других языках, где метод является конкретным в суперклассе, но становится абстрактным, когда он находится в подклассе.У этого шаблона / концепции есть имя?

Заранее благодарен за любую помощь, и я извиняюсь, если дублирую другой вопрос, но я не знал, что искать, кроме "подкласса"в теге target-c, который дал слишком много результатов, чтобы найти то, что я искал.

Ответы [ 3 ]

11 голосов
/ 24 декабря 2010

Плохая идея.NSArray на самом деле кластер классов (что является нашим словом [по существу] абстрактной фабрики).Это означает, что когда вы alloc / init и NSArray, вы на самом деле не получаете NSArray назад.Вы получаете (обычно) NSCFArray, который является частным подклассом.

NSMutableArray - это то же самое предложение (оно абстрактно).Когда вы alloc / init и NSMutableArray, вы получаете обратно NSCFArray, у которого слегка перевернут внутренний изменяемый бит.

Результатом этого является то, что подкласс кластера классов обычно не рекомендуется,потому что это немного сложнее, чем просто создание нормального подкласса.

Я бы порекомендовал вместо этого проверить CHDataStructures Framework , который имеет целую кучу структур данных, которые делают то, что выуже ищем.

2 голосов
/ 24 декабря 2010

См. Пост Дэйва Делонга о том, почему это не очень хорошая идея.

Если вы действительно хотите сделать что-то подобное, вы можете попробовать "фальшивое подклассификация".1004 * в файле .h,

...
NSMutableArray *mutableArray;
...
@property (nonatomic, retain) NSMutableArray *mutableArray;
...
- (void) addObject:(id)anObject;

в файле .m,

...
@synthesize mutableArray;
...
- (void) addObject:(id)anObject {
    [mutableArray addObject:id];
    [mutableArray sortUsingSelector:@selector(yourSortingSelector);
}

- (NSMutableArray)mutableArray {
    return mutableArray;
}
...

, который работает и все.Мой коллега уже проводил уроки, подобные этому (раньше мы были объективными новичками, около 2-3 недель, чтобы научиться кодировать).

Однако я бы порекомендовал использовать Наблюдение значения ключа , если возможно.Попробуйте прослушивать каждый раз, когда добавляется элемент, и сортировать массив при получении уведомления.Я не делал этого ранее с NSMutableArray, поэтому я не знаю, как это будет работать или даже будет ли это.

Мои 2 цента, надеюсь, это поможет.Счастливых праздников!^ _ ^

1 голос
/ 24 декабря 2010

Вы не должны создавать подклассы NSMutableArray, ищите категории. Он позволяет добавлять новые классы в классы

ссылка яблока на категории

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...