Вызов метода для дочернего класса из метода родительского класса (Objective-c 2.0) - PullRequest
6 голосов
/ 16 декабря 2011

У меня есть опыт работы с объектно-ориентированным программированием, однако эта ситуация почему-то незнакома.Рассмотрим следующий код Objective-c 2.0:

@interface A : NSObject
@end

@implementation A
- (void) f {
    [self g];
}
@end

@interface B : A
@end

@implementation B
- (void) g {
    NSLog(@"called g...");
}
@end

Является ли это правильным способом вызова метода дочернего класса из метода родительского класса?Что произойдет, если другой дочерний класс не реализует метод g?Возможно, есть лучший способ решить эту проблему, например, абстрактный метод в родительском классе A?

Ответы [ 2 ]

12 голосов
/ 16 декабря 2011

Ключ должен иметь метод в родительском классе, который может быть переопределен в дочернем классе.

@interface Dog : NSObject
- (void) bark;
@end

@implementation Dog
- (void) bark {
    NSLog(@"Ruff!");
}
@end

@interface Chihuahua : Dog
@end

@implementation Chihuahua
- (void) bark {
    NSLog(@"Yipe! Yipe! Yipe!");
}
@end

Видите ли, ваш дочерний класс переопределит родительский метод своей собственной реализацией. Вы могли бы видеть, что это используется так:

Dog *someDog = [Chihuahua alloc] init] autorelease];
[someDog bark];

Выход: Yipe! Yipe! Yipe!

3 голосов
/ 16 декабря 2011

Вы должны реализовать g в родительском классе, но заставить его ничего не делать.Таким образом, он может быть вызван без ошибок, но все же может быть переопределен.

@interface A : NSObject
@end

@implementation A
- (void) f {
    [self g];
}
- (void) g {} // Does nothing in baseclass
@end

@interface B : A
@end

@implementation B
- (void) g {
    NSLog(@"called g...");
}
@end

Или вы проверяете метод объекта перед его выполнением.

if ([self respondsToSelector:@selector(g)]) {
  [self performSelector:@selector(g) withObject:nil];
}

Но это может получитьдовольно некрасиво.

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