2012-03-19 94 views
7

在继承一个类的同时,我还想继承父类的委托,因为子类现在具有附加功能。要做到这一点,最好的方法是什么?如果我只是声明另一个代表属性在子类中使用相同的名字,我会得到一个警告“物业类型‘ID’是类型不兼容‘身份证’,从‘父类’如何在Objective-C中正确地继承委托属性?

回答

1

遵循NSTableViewNSOutlineView的例子继承。

NSOutlineView是NSTableView的的一个子类,并定义它自己的协议,用于其dataSourcedelegate

NSTableView声明它代表这种方式:

- (void)setDelegate:(id <NSTableViewDelegate>)delegate; 
- (id <NSTableViewDelegate>)delegate; 

NSOutlineView

- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject; 
- (id <NSOutlineViewDelegate>)delegate; 

显然,编译器是更宽松裸方法声明比它与属性声明。

与NSTable/OutlineView不同,您可能希望使子类的协议从基类的协议继承,例如,

@protocol SpecializedProtocol <BaseProtocol> 

......这可能取决于情况。

+0

我用后者的路线(继承了主类后的委托协议的子类),但无法在不触发编译器错误的情况下声明另一个委托属性。您提到的方法声明是让编译器高兴的唯一方法吗? – Boon 2012-03-19 11:29:17

+0

我不知道有任何其他的方式来做到这一点。 – 2012-03-19 17:04:25

15

鉴于这个例子中产生的警告:

// Class A 
@protocol ClassADelegete; 

@interface ClassA : NSObject 
@property (nonatomic, weak) id<ClassADelegete> delegate; 
@end 

@protocol ClassADelegete <NSObject> 
- (void)classADidSomethingInteresting:(ClassA *)classA; 
@end 

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

两个解决方案,删除警告的。

1)在子类中,将协议定义放在类定义之前。这是UITableViewDelegateUITableView.h作用:

// Class B 
@class ClassB; 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; 
@end 

2)在子类中,添加原始协议沿着新:

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate; 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

我认为(1)可以作为苹果公司这样做,选项(2)删除警告,但我没有编译和运行任何设置这种方式。