2012-03-19 12 views
7

クラスのサブクラス化では、サブクラスに追加の機能が追加されているので、親クラスのデリゲートもサブクラス化したいと考えています。これを行う最善の方法は何ですか?私はちょうど同じ名前のサブクラスで別のデリゲートプロパティを宣言した場合、私は警告を受けるだろう「プロパティのタイプ 『idが』 『idは』 『ParentClass』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> 

...場合によっては状況によって異なります。ある警告を削除

// 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 

2種類の溶液:

+0

私は後者のルート(メインクラスをサブクラス化した後にデリゲートプロトコルをサブクラス化する)を行ったが、コンパイラエラーをトリガーせずに別のデリゲートプロパティを宣言できませんでした。コンパイラを幸せにするための唯一の方法を述べたメソッド宣言はありますか? – Boon

+0

私は他のやり方を知らない。 –

15

は警告を生成します。この例を考えます。

1)サブクラスでは、クラス定義の前にプロトコル定義を配置します。サブクラスでは)

// Class B 
@class ClassB; 

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

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

2、新しいものと一緒にオリジナルのプロトコルを追加します:これはUITableView.hUITableViewDelegateが何をするかである

// Class B 
@protocol ClassBDelegete; 

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

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

私はAppleがこのようにそれがそうであるように(1)働くと仮定し、オプション(2)は警告を削除しますが、私はコンパイルしてこのような設定を何も実行していません。

関連する問題