【发布时间】:2012-01-29 08:30:23
【问题描述】:
在他的 iOS 编程书的第二章中,Joe Conway 描述了在子类化事件中在类方法中使用“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 *
我按如下方式覆盖了 BallGlove 中的 +randomPossession:
+(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 的一个实例,但是我对可接受的实现很感兴趣。提前致谢。
【问题讨论】:
标签: objective-c class methods overriding