Понимание наследования протоколов в Objective-C
Я буду признателен, если кто-нибудь сможет объяснить логику наследования протокола. например что означает следующее (UITableView.h):
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
Следующая реализация класса не работает. У меня есть класс View1 (который наследует UIView), с соответствующим протоколом. У меня есть другой класс, View2 (который наследует View1). Теперь я хочу наследовать и протокол. Может ли кто-нибудь указать мне в правильном направлении.
Класс 1:
@protocol View1Delegate;
@interface View1 : UIView {
id <View1Delegate> delegate;
// . . .
}
@property (nonatomic, assign) id <View1Delegate> delegate; // default nil. weak reference
@end
@protocol View1Delegate <NSObject>
- (void)View1DelegateMethod;
@end
@implementation View1
@synthesize delegate;
// . . .
@end
Класс 2:
@protocol View2Delegate;
@interface View2 : View1 {
id <View2Delegate> delegate;
// . . .
}
@property (nonatomic, assign) id <View2Delegate> delegate; // default nil. weak reference
@end
@protocol View2Delegate <NSObject>
- (void)View2DelegateMethod;
@end
@implementation View2
@synthesize delegate;
// . . .
@end
Ответы
Ответ 1
Подумайте об этом скорее как о композиции, а не о наследовании.
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
определяет протокол, который включает все методы протокола NSObject
, протокол UIScrollViewDelegate
, а также любые методы, определенные для протокола UITableViewDelegate
. Когда вы подклассифицируете и создаете новое свойство, вы переопределяете тип свойства суперкласса. Чтобы сделать эту работу, как я думаю, вы хотите, вы должны объявить View2Delegate
как @protocol View2Delegate <NSObject, View1Delegate>
.
Ответ 2
Это точно так же, как наследование интерфейсов в Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate
), С# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate
) и т.д.