принуждение к вызову метода подкласса UIViewController - PullRequest
0 голосов
/ 04 февраля 2012

поэтому я создал подкласс UIViewController, который я создаю.Вопрос в том, есть ли способ заставить метод вызывать с использованием подкласса, если я создаю суперкласс.Я знаю, что это глупо, так же, как заставлять млекопитающее называть поведение собаки.Но прежде чем сделать это, я сначала проверяю, что это млекопитающее - собака, иначе я не буду это называть.Это плохо делать?Если нет, то как я могу это сделать?Я попытался привести суперкласс в его подкласс, а затем выполнить вызов метода, но он не работает.Есть мысли?

Итак, что я пытаюсь сделать.У меня есть UIViewController A и подкласс этого B. Если у меня есть A и я хочу вызвать метод B, который переопределяет A, как мне это сделать?Я надеюсь, что это ясно

Ответы [ 3 ]

4 голосов
/ 04 февраля 2012

Существует разница между тем, как вы объявляете свой объект и тем, чем он является на самом деле. Рассмотрим этот пример:

Mammal *mammal = [[Dog alloc] init]; //Dog is a subclass of Mammal

Здесь у вас есть указатель на объект Mammal, который фактически указывает на экземпляр специализированного класса Dog. Это верно, потому что у млекопитающего есть все методы, которые есть у собаки.

Вы можете проверить, является ли какой-либо экземпляр Mammal на самом деле Dog, используя isKindOfClass:, например:

if ([mammal isKindOfClass:[Dog class]]) {
    [(Dog *)mammal bark];
}

Это совершенно верно. Однако, если бы вы создали mammal с [[Mammal alloc] init], проверка для класса Dog не удалась бы, и вы не смогли бы вызывать какие-либо методы, которые есть только у Dog. Если вы не сделаете проверку, это на самом деле приведет к сбою, потому что приведение не изменяет объект каким-либо образом, оно просто говорит компилятору: «Я знаю, что делаю, не предупреждайте меня».

1 голос
/ 04 февраля 2012

Я верю, что вы можете идти только вверх по иерархии, а не вниз. Таким образом, вы можете вызывать суперкласс из вашего класса, но не подкласс. Там нет никакого отношения, если вы не инициализируете свой подкласс, передавая ссылку на его суперкласс.

Это то, что вы ищете?

0 голосов
/ 04 февраля 2012

У меня есть 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"

Важно по-настоящему понять это, так как это фундаментально для понимания того, как работать с объектами разных типов. Поэтому потратьте некоторое время на написание таких маленьких глупых примеров программ и продолжайте задавать вопросы, пока не убедитесь, что они у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...