Я немного новичок в 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, который дал слишком много результатов, чтобы найти то, что я искал.