iPhone: общая функция, но разные классы - PullRequest
0 голосов
/ 28 ноября 2010

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

Я хочу иметь единственный метод, без необходимости вызывать [MovieClip loadLandscape]; в реализации временной шкалы

RotatingProtocol.h


@protocol RotatingProtocol
@required

- (void)loadPortrait;
- (void)loadLandscape;

@end

MovieClip.h


#import "RotatingProtocol.h"

@interface MovieClip : UIButton <RotatingProtocol> {

}

@end

MovieClip.m


#import "MovieClip.h"

@implementation MovieClip

- (void)loadPortrait {
  // UIButton -> setframe to fit portrait screen
}

- (void)loadLandscape {
  // Popup and alert!
}

@end

Timeline.h


#import "RotatingProtocol.h"

@interface Timeline : UIScrollView <RotatingProtocol> {

}

@end

Timeline.m


#import "Timeline.h"

@implementation Timeline 

- (void)loadPortrait {
  // Do funny animation
}

- (void)loadLandscape {
  // Do exactly the same thing as [MovieClip loadLandscape]
}

@end

1 Ответ

0 голосов
/ 28 ноября 2010

Одним из возможных решений, которое я не решаю рекомендовать, является предоставление в UIView категории (суперкласса наивысшего уровня, совместно используемой обоими классами), которая добавляет реализацию метода loadLandscape, тогда вы можете оставить ее вне объектов и просто объявить классподдерживает этот протокол (а также импортирует категорию).

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

Техника, которую я бы использовал, заключается в том, чтобы поместить эту реализацию в нечто вроде класса RotatingProtocolImplementation в качестве метода уровня класса.Что-то должно знать, чтобы вызвать метод loadLandscape вашего протокола, и что-то могло бы так же легко обнаружить объявленную классом поддержку протокола и вызвать метод уровня общего класса вместо метода на самом экземпляре класса - так что протокол мог бы статьбольше протокола маркера, без такого количества (или каких-либо) методов, которые класс должен был бы определить для его поддержки.

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