В Objective-C, я перенаправить метод содержащего экземпляра без его подкласса? - PullRequest
0 голосов
/ 01 июня 2009

Как в Objective-C вы переписываете метод экземпляра класса для вызова метода в другом классе?

Скажем, класс A UIView содержит другой класс UIView с именем childA. Я хочу, чтобы при вызове drawRect childA вызывался метод в классе A без необходимости создавать подкласс childA и делать там необходимый вызов в его drawRect. Как этого достичь?

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

Ответы [ 2 ]

1 голос
/ 01 июня 2009

Чтобы ответить на ваш первый вопрос о методах подключения:

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

Взгляните на Objective-C 2.0 Runtime Reference , который содержит ключи от королевства как бы. Посмотрите на функции class_getInstanceMethod, method_getImplementation, method_getTypeEncoding и class_addMethod, которые в сочетании позволяют изменять методы класса во время выполнения.

Если вы просто переключаете один селектор на другой, method_exchangeImplementations - это полезный ярлык.

Чтобы ответить на ваш второй вопрос о динамическом предоставлении метода, это так же просто, как передать SEL методу и затем вызвать -performSelector:withObject::

@interface MyView : NSView {
    SEL drawingSelector;
    id drawingDelegate;
}
@property SEL drawingSelector;
@property id drawingDelegate;
@end

@implementation MyView

- (void)drawRect:(NSRect)rect {
    [self.drawingDelegate performSelector:drawingSelector withObject:[NSValue valueWithRect:rect]];
}

@end
0 голосов
/ 01 июня 2009

Для первой проблемы, которую вы подняли, похоже, что вы настроили бы UIView A как объект делегата childA и другие UIViews - тогда они могли бы использовать методы делегата для вызова дополнительных функций рисования, которые вы хотели в A.

Либо так, либо каждый ребенок запрашивает суперпредставление, и, если оно относится к типу "A", вызовите интересующий вас метод.

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