Jeśli mam dwie klasy, podklasy i nadklasy:Czy istnieje odpowiednik dynamicznej obsady C++ w 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");
mogę osiągnąć to samo w Objective-C z isMemberOfClass następująco:
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");
Czy istnieje prostszy sposób niż to?
(PS Wiem, że nie muszę używać dodatkowej zmiennej id, ale wtedy musiałbym wymusić rzutowanie super na SubClass *, co czasami powodowałoby nieprawidłowe odwołanie, które musiałbym później posprzątać. że realizacja jest jednak mniej rozwlekły, a to poniżej)
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");
'sprawdza dynamic_cast' jeśli obiekt jest, że klasa lub jeden z jego podklasy. Różni się to od 'isMemberOfClass:', które sprawdza tylko dla tej klasy. 'dynamic_cast' jest równoważne' isKindOfClass: 'co również sprawdza podklasy. – user102008