【问题标题】:Understanding Protocol Inheritance in Objective-C理解 Objective-C 中的协议继承
【发布时间】:2010-09-20 13:27:42
【问题描述】:

如果有人能解释协议继承背后的逻辑,我将不胜感激。例如以下是什么意思(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

【问题讨论】:

    标签: iphone objective-c inheritance protocols


    【解决方案1】:

    更多地将其视为组合而不是继承。

    @protocol UITableViewDelegate&lt;NSObject, UIScrollViewDelegate&gt; 定义的协议包括NSObject 协议、UIScrollViewDelegate 协议的所有方法,以及为UITableViewDelegate 协议定义的任何方法。当您子类化并创建新属性时,您将覆盖超类属性的类型。要按照我的想法进行这项工作,您应该将View2Delegate 声明为@protocol View2Delegate &lt;NSObject, View1Delegate&gt;

    【讨论】:

    • 感谢您的回复。我正在声明您提到的协议,但我面临的问题是声明 id <...>delegate;在 View1 中,我有 id 委托;它与@property 和@synthesize 相关联。由于我在 View2 中继承 View1,所以当我声明 id delagete;与它相关联的@property 和@synthesize,我收到一个错误:“属性'delegate' 试图使用'View2' 的超类中声明的ivar'delegate'。处理这种情况的正确方法是什么。请参阅示例类我'已经在上面发布了。
    【解决方案2】:

    与Java(interface UITableViewDelegate extends NSObject, UIScrollViewDelegate)、C#(interface UITableViewDelegate : NSObject, UIScrollViewDelegate)等接口的继承完全一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2011-02-28
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      相关资源
      最近更新 更多