Как мне правильно переопределить метод класса в Objective-C в подклассе?

Во второй главе своей книги по программированию для 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, однако меня интересовала приемлемая реализация. Заранее спасибо.

10
задан MadhavanRP 28 December 2011 в 17:29
поделиться