Понимание наследования протокола в Objective-C - PullRequest
12 голосов
/ 20 сентября 2010

Буду признателен, если кто-нибудь сможет объяснить логику наследования протокола.например, что означает следующее (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

Ответы [ 2 ]

12 голосов
/ 20 сентября 2010

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

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

0 голосов
/ 09 августа 2011

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

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