Joe Conway在他的iOS編程書的第二章中描述了在子類中使用類方法中的'self'。我理解這個概念並對子類問題有一個疑問。如何正確覆蓋子類中Objective-C中的類方法?
背景:我們創建了一個藏類,其類方法+ 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 = ...
我子類佔有並創建了一個類中調用BallGlove,其中包括一個新的伊娃,名優產品,一個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的一個實例,但是我對可接受的實現感興趣。提前致謝。
+ randomPossession在基類中實際上調用了指定的初始值設定項。類方法也爲該初始化器創建「隨機」值。如果我按照我相信你所建議的做法,我必須在重寫的類方法(+ randomPossession)中複製這些「隨機」值的代碼,並重寫指定的初始化程序以調用BallGlove類的新初始化程序,添加我的附加iVar信息。爲什麼重寫階級方法,因爲我在一般意義上建議有害的?難道它不能像鏈接初始化器嗎? –
我不認爲它太醜陋 - 它不是一個很常見的模式。這個問題本身就是一個很好的指標。 :)有一點與子類化有點模糊的是方法的名稱,好的命名是關於objective-c的最好的事情之一。所以在你的情況下,一個方法+ randomBallGlove可能比重寫更好。 – Eiko
你建議我改爲創建一個名爲+ randomBallGlove的類方法,除了需要的自定義實現之外,還包括+ randomPossession的實現?聽起來不錯。對於Possession的子類,仍然可以使用+ randomPossession,你有什麼建議?重寫方法並讓它拋出一個異常,指示使用+ randomBallGlove?這通常是這種事件的正常協議嗎?我知道這個例子在現實中可能並不存在,我只是在學習,並且很好奇接受的實現。謝謝你的幫助! –