Nel secondo capitolo del suo libro di programmazione iOS, Joe Conway descrive l'uso di "sé" nei metodi di classe in caso di sottoclassi. Comprendo questo concetto e ho una domanda sul problema della sottoclasse.Come sovrascrivere correttamente un metodo di classe in un Objective-C in una sottoclasse?
Background: Abbiamo creato una classe Possesso cui metodo di classe + randomPossession si presenta così:
+(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];
}
Sono consapevole del fatto che il valore di ritorno in realtà dovrebbe essere di tipo id tale che id = newPossession ...
I sottoclasse Possesso e ha creato una classe chiamata BallGlove che ha incluso un nuovo iVar, Marca, un NSString *
ho calpestato il + randomPossession in BallGlove come segue:
+(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;
}
La mia domanda è questa: è il modo in cui ho scavalcato questo metodo di classe appropriato e accettabile dalla comunità (ad es. parallelo il formato -init catturando la super implementazione in una variabile, manipolare la variabile di conseguenza e quindi restituirla? Il mio output mostra che l'oggetto restituito è un'istanza di BallGlove, tuttavia, ero interessato all'implementazione accettabile. Grazie in anticipo.
+ randomPossession nella classe base in effetti chiama l'inizializzatore designato. Il metodo di classe crea anche valori "casuali" per quell'inizializzatore. Se faccio ciò che ritengo suggerisco, dovrei replicare il codice per quei valori "casuali" nel metodo della classe sovrascritta (+ randomPossession), oltre a sovrascrivere l'inizializzatore designato per chiamare un nuovo inizializzatore della classe BallGlove, che sarebbe aggiungi le mie ulteriori informazioni su iVar. Perché sovrascrivere il metodo di classe come ho proposto di essere dannoso in senso generale? Non può essere paragonato a concatenare gli inizializzatori? –
Non penso che sia eccessivamente brutto, ma non è un modello molto comune. La domanda in sé è un buon indicatore per questo. :) Una cosa che diventa un po 'vaga con la sottoclasse è il nome del metodo, e una buona nomenclatura è una delle cose migliori dell'obiettivo-c. Quindi nel tuo caso un metodo + randomBallGlove potrebbe essere meglio che ignorare. – Eiko
Stai suggerendo di creare invece un metodo di classe denominato + randomBallGlove che include l'implementazione di + randomPossession oltre all'implementazione personalizzata desiderata? Per me va bene. Cosa suggerisci che + randomPossession sia ancora disponibile per sottoclassi di Possession? sovrascrivere il metodo e lanciare un'eccezione che indichi l'uso di + randomBallGlove? Questo è in genere il normale protocollo di tali eventi?So che questo esempio potrebbe non esistere nella realtà, sto solo imparando e sono curioso di accettare l'implementazione nel caso in cui ciò accada. Grazie per l'aiuto! –