Si tengo dos clases, subclase y superclase:¿Hay un equivalente al lanzamiento dinámico de C++ en Objective-C?
SuperClass *super = new SuperClass();
SubClass *sub = new SubClass();
SubClass *sub_pointer;
// **The nice one-line cast below**
sub_pointer = dynamic_cast<SubClass*> super;
// Prints NO
printf("Is a subclass: %s\n", sub_pointer ? "YES" : "NO");
sub_pointer = dynamic_cast<SubClass*> sub;
// Prints YES
printf("Is a subclass: %s\n", sub_pointer ? "YES" : "NO");
puedo lograr lo mismo en Objective-C con isMemberOfClass de la siguiente manera:
SuperClass *super = [[SuperClass alloc] init];
SubClass *sub = [[SubClass alloc] init];
SubClass *sub_pointer;
id generic_pointer;
// Not as easy:
generic_pointer = super;
if ([generic_pointer isMemberOfClass:[SubClass class]]) {
sub_pointer = generic_pointer;
} else {
sub_pointer = nil;
}
// Logs NO
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");
generic_pointer = sub;
if ([generic_pointer isMemberOfClass:[SubClass class]]) {
sub_pointer = generic_pointer;
} else {
sub_pointer = nil;
}
// Logs YES
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");
¿Existe una manera más fácil que esto?
(PD Sé que no tengo que usar la variable de id. Adicional, pero entonces tendría que forzar el molde super a SubClass *, lo que algunas veces resultaría en una referencia inválida que tendría que limpiar después. que la aplicación, sin embargo, es menos palabras, y es a continuación)
SuperClass *super = [[SuperClass alloc] init];
SubClass *sub = [[SubClass alloc] init];
SubClass *sub_pointer;
// Not as easy:
sub_pointer = (SubClass*) super;
if (![sub_pointer isMemberOfClass:[SubClass class]]) {
sub_pointer = nil;
}
// Logs NO
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");
sub_pointer = (SubClass*) sub;
if (![sub_pointer isMemberOfClass:[SubClass class]]) {
sub_pointer = nil;
}
// Logs YES
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");
'controles dynamic_cast' si el objeto es esa clase o una de sus subclases. Esto es diferente de 'isMemberOfClass:' que solo busca esa clase. 'dynamic_cast' es equivalente a' isKindOfClass: 'que también verifica las subclases. – user102008