Во второй главе своей книги по программированию для iOS Джо Конвей описывает использование «self» в методах класса в случае создания подкласса. Я понимаю эту концепцию, и у меня есть вопрос по поводу создания подклассов.
Предыстория: Мы создали класс Possession, чей метод класса + randomPossession выглядит так:
+(id)randomPossession
{
NSArray *randomAdjectiveList = [NSArray arrayWithObjects:@"Fluffy", @"Rusty", @"Shiny", nil];
NSArray *randomNounList = [NSArray arrayWithObjects:@"Bear", @"Spork", @"Mac", nil];
unsigned long adjectiveIndex = rand() % [randomAdjectiveList count];
unsigned long nounIndex = rand() % [randomNounList count];
NSString *randomName = [NSString stringWithFormat:@"%@ %@", [randomAdjectiveList objectAtIndex:adjectiveIndex], [randomNounList objectAtIndex:nounIndex]];
int randomValue = rand() % 100;
NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
'0' + rand() % 10,
'A' + rand() % 10,
'0' + rand() % 10,
'A' + rand() % 10,
'0' + rand() % 10];
Possession *newPossession = [[self alloc] initWithPossessionName:randomName valueInDollars:randomValue serialNumber:randomSerialNumber];
return [newPossession autorelease];
}
Я знаю, что возвращаемое значение действительно должно иметь тип id, такой что id newPossession = ...
Я разделил Possession на подклассы и создал класс BallGlove, который включал новые iVar, brandName, NSString *
Я переопределил + randomPossession в BallGlove следующим образом:
+(id)randomPossession
{
BallGlove *myGlove = [super randomPossession];
NSArray *brandNames = [NSArray arrayWithObjects:@"Rawlings", @"Mizuno", @"Wilson", nil];
unsigned long randomNameIndex = rand() % [brandNames count];
[myGlove setBrandName:[brandNames objectAtIndex:randomNameIndex]];
NSLog(@"myGlove is of type class: %@", [self class]);
return myGlove;
}
Мой вопрос таков: приемлемо ли и приемлемо ли способ, которым я переопределил этот метод класса сообществом (т. е. параллельно формату -init, фиксируя супер-реализацию в переменной, соответствующим образом манипулируя переменной и затем возвращая ее? Мои результаты показывают, что возвращенный объект является экземпляром BallGlove, однако меня интересовала приемлемая реализация. Заранее спасибо.