问题 了解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

9068
2017-09-20 13:27


起源



答案:


将其视为构图而非继承。

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 定义一个包含所有方法的协议 NSObject 协议, UIScrollViewDelegate 协议,以及为此定义的任何方法 UITableViewDelegate 协议。当您子类化并创建新属性时,您将覆盖超类属性的类型。为了使这项工作我认为你想要的,你应该声明 View2Delegate 如 @protocol View2Delegate <NSObject, View1Delegate>


12
2017-09-20 13:37



谢谢您的回复。我正如你所提到的那样宣布协议,但我面临的问题是id <...> delegate的声明;在View1中,我有id <View1Delegate>委托;与它相关联的@property和@synthesize。因为我在View2中继承View1,当我声明id <View2Delegate> delagete;与它关联的@property和@synthesize,我得到一个错误:“属性'委托'试图使用在'View2'的超级类中声明的ivar'委托'。处理这种情况的正确方法是什么。请参阅示例类我已在上面发布。 - Mustafa


答案:


将其视为构图而非继承。

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 定义一个包含所有方法的协议 NSObject 协议, UIScrollViewDelegate 协议,以及为此定义的任何方法 UITableViewDelegate 协议。当您子类化并创建新属性时,您将覆盖超类属性的类型。为了使这项工作我认为你想要的,你应该声明 View2Delegate 如 @protocol View2Delegate <NSObject, View1Delegate>


12
2017-09-20 13:37



谢谢您的回复。我正如你所提到的那样宣布协议,但我面临的问题是id <...> delegate的声明;在View1中,我有id <View1Delegate>委托;与它相关联的@property和@synthesize。因为我在View2中继承View1,当我声明id <View2Delegate> delagete;与它关联的@property和@synthesize,我得到一个错误:“属性'委托'试图使用在'View2'的超级类中声明的ivar'委托'。处理这种情况的正确方法是什么。请参阅示例类我已在上面发布。 - Mustafa


它与Java中接口的继承完全相同(interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), C# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate)等


0
2017-08-08 23:15