はじめに
delegateを普通に実装していると、表示部分とイベント部分が一緒に定義されていて、表示は共通で実装したいが、イベントはそれぞれの呼び出し元で実装したいことがあります。
クラスを継承すれば、とりあえずは実装できますが、別のdelegateを定義しなくてはならなくて、スマートではないので、既存のプロトコルを生かした形で実現できる方法をまとめます。
オリジナル
プロトコル
OriginalDelegate.h
@protocol OriginalDelegate : NSObject
- (void)doCommon;
- (void)doPartly;
@end
インターフェース
Original.h
@interface Original : NSObject
@property (nonatomic, weak) id<OriginalDelegate> delegate;
@end
オリジナルを継承した実装
インターフェース
Extend.h
@interface Extend : Original <OriginalDelegate>
@end
実装
Extend.m
@interface Extend () <OriginalDelegate>
// 呼び出し元を設定するdelegateを別名で定義
@property (nonatomic, weak) id<OriginalDelegate> originalDelegate;
@end
@implementation Extend
@synthesize delegate = _delegate;
- (void)init {
if (self = [super init]) {
//delegateを共通部分を実装しているインスタンスに設定
_delegate = self;
}
}
- (id<OriginalDelegate>)delegate {
return _delegate;
}
// 呼び出すdelegateを設定
- (void)setDelegate:(id<OriginalDelegate>)delegate {
self.originalDelegate = delegate;
}
- (void)doCommon {
// doSomething.
}
- (void)doPartly {
// 呼び出し元をcall
// ここにも共通の処理を実装できる
[self.originalDelegate didPartly];
}
@end
最後に
これで、呼び出し元でオリジナルと同様のインターフェース/プロトコルで実装できます。