2012-03-19 99 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)刪除警告,但我沒有編譯和運行任何設置這種方式。