En el segundo capítulo de su libro de programación de iOS, Joe Conway describe el uso de 'self' en métodos de clase en el caso de subclases. Entiendo este concepto y tengo una pregunta sobre el tema de la creación de subclases.¿Cómo anulo correctamente un método de clase en un Objective-C en una subclase?
Antecedentes: Hemos creado una clase cuya posesión método de clase + randomPossession se ve así:
+(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];
}
Soy consciente de que el valor de retorno debe realmente ser de tipo ID Identificación de tal manera que newPossession = ...
I subclases posesión y creó una clase llamada BallGlove que incluía un nuevo Ivar, nombre de la marca, un NSString *
me hizo caso omiso de la randomPossession + en BallGlove de la siguiente manera:
+(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;
}
Mi pregunta es esta: ¿Es la manera en que superé este método de clase apropiado y aceptable por la comunidad (es decir Paralelamente al formato de entrada capturando la súper implementación en una variable, manipule la variable en consecuencia y luego devuélvala. Mi resultado muestra que el objeto devuelto es una instancia de BallGlove; sin embargo, estaba interesado en la implementación aceptable. Gracias por adelantado.
+ randomPossession en la clase base de hecho llama al inicializador designado. El método de clase también crea valores "aleatorios" para ese inicializador. Si hago lo que creo que estás sugiriendo, tendría que replicar el código para esos valores "aleatorios" en el método de clase reemplazado (+ randomPossession) así como anular el inicializador designado para llamar a un nuevo inicializador de la clase BallGlove, que haría agregue mi información iVar adicional. ¿Por qué está anulando el método de clase como lo propuse perjudicial en un sentido general? ¿No se puede comparar con encadenar inicializadores? –
No creo que sea demasiado feo, simplemente no es un patrón muy común. La pregunta en sí es un buen indicador de eso. :) Una cosa que se vuelve un poco vaga con la subclasificación es el nombre del método, y un buen nombre es una de las mejores cosas sobre objetivo-c. Entonces, en tu caso, un método + random BallGlove podría ser mejor que anular. – Eiko
¿Está sugiriendo que, en su lugar, cree un método de clase llamado + random BallGlove que incluya la implementación de + randomPossession además de la implementación personalizada deseada? Suena bien para mí. ¿Qué sugieres para que + la Posesión aleatoria siga estando disponible para las subclases de Posesión? anular el método y hacer que arroje una excepción al dirigir el uso de + randomBallGlove? ¿Es este el protocolo normal de tales eventos?Sé que este ejemplo puede no existir en realidad, solo estoy aprendiendo y tengo curiosidad por la implementación aceptada en caso de que suceda. ¡Gracias por tu ayuda! –