Подтвердить что ты не робот

Понимание наследования протоколов в 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
4b9b3361

Ответ 1

Подумайте об этом скорее как о композиции, а не о наследовании.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> определяет протокол, который включает все методы протокола NSObject, протокол UIScrollViewDelegate, а также любые методы, определенные для протокола UITableViewDelegate. Когда вы подклассифицируете и создаете новое свойство, вы переопределяете тип свойства суперкласса. Чтобы сделать эту работу, как я думаю, вы хотите, вы должны объявить View2Delegate как @protocol View2Delegate <NSObject, View1Delegate>.

Ответ 2

Это точно так же, как наследование интерфейсов в Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), С# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate) и т.д.