Bri*_*lma 10 methods overriding class objective-c
在他的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];
}
Run Code Online (Sandbox Code Playgroud)
我知道返回值应该是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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我改变这种类方法的方式是否适合社区接受(即通过捕获变量中的超级实现来并行-init格式,相应地操作变量然后返回它?我的输出显示返回的对象是BallGlove的一个实例,但我对可接受的实现感兴趣.提前感谢.
技术上没问题。
不过,我会提出一个替代方案。如果您的基类上已经有一个指定的公共初始值设定项(无论如何您可能希望从该工厂类方法创建并调用该初始值设定项),然后在子类的类中使用该初始值设定项(甚至是子类中的新初始值设定项)方法。
代码不多,但在我看来更容易遵循并且面向未来。初始化程序在某一时刻也可能会派上用场,但当然它并不是适用于每个应用程序的解决方案。