У меня есть UIViewController A и подкласс этого B. Если у меня есть A и
Я хочу вызвать метод B, который переопределяет A, как мне это сделать?
Вы просто вызываете метод. Если на самом деле объект является экземпляром B, то будет выполнена версия B этого метода. Если объект был создан как экземпляр A, будет вызвана версия метода A. Попробуйте сами, чтобы действительно понять это:
@interface A : NSObject
{}
@end
@implementation A
- (void)whoAmI
{
NSLog(@"I'm an A\n);
}
@end
@interface B : A
@end
@implementation B
- (void)whoAmI
{
NSLog(@"I'm a B\n");
}
@end
//...
A *a = [[A alloc] init];
A *b = [[B alloc] init];
B *c = [[A alloc] init];
B *d = [[B alloc] init];
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B"
В реализации подкласса вы можете вызвать метод суперкласса, используя ключевое слово super
вместо self
. Например, другой метод B может вызвать B's -whoAmI
, например:
[self whoAmI];
или это может вызвать реализацию суперкласса, например:
[super whoAmI];
Это в основном полезно в переопределениях того же метода, так что вы можете сохранить унаследованное поведение, но добавить к нему. -whoAmI
B может быть реализовано так:
- (void)whoAmI
{
NSLog(@"I'm a B\n");
[super whoAmI];
}
В этом случае приведенный выше фрагмент кода будет иметь результаты, показанные в комментариях:
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B" followed by "I'm an A"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B" followed by "I'm an A"
Важно по-настоящему понять это, так как это фундаментально для понимания того, как работать с объектами разных типов. Поэтому потратьте некоторое время на написание таких маленьких глупых примеров программ и продолжайте задавать вопросы, пока не убедитесь, что они у вас есть.