2012-03-19 9 views
7

Nella sottoclasse di una classe, voglio anche creare una sottoclasse di un delegato della classe genitore dato che la sottoclasse ora ha funzionalità aggiuntive. Qual è il modo migliore per farlo? Se ho appena dichiaro un'altra proprietà delegato nella sottoclasse con lo stesso nome che avrei avuto un avvertimento "Tipo di proprietà 'id' non è compatibile con il tipo di 'id' ereditato da 'ParentClass'Come sottoclasse correttamente una proprietà delegata in Objective-C?

risposta

1

Seguite l'esempio di NSTableView e NSOutlineView.

NSOutlineView è una sottoclasse di NSTableView, e definisce il proprio protocollo per la sua dataSource e delegate

NSTableView dichiara suo delegato questo modo:.

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

e NSOutlineView:

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

A quanto pare il compilatore è più indulgente con dichiarazioni di metodo nude quanto lo sia con dichiarazioni di proprietà.

A differenza di NSTable/OutlineView, è possibile rendere il protocollo della sottoclasse ereditato dal protocollo della classe base, ad es.

@protocol SpecializedProtocol <BaseProtocol> 

... probabilmente dipende dalla situazione.

+0

Sono andato con la seconda rotta (sottoclasse il protocollo delegato dopo la sottoclasse della classe principale), ma non è stato in grado di dichiarare un'altra proprietà delegata senza attivare l'errore del compilatore. Le dichiarazioni di metodo che hai menzionato sono l'unico modo per rendere felice il compilatore? – Boon

+0

Non conosco nessun altro modo per farlo. –

15

Dato questo esempio che produce l'avvertimento:

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

due soluzioni che rimuovono l'avvertimento sono.

1) Nella sottoclasse, posizionare la definizione del protocollo prima della definizione della classe. Questo è ciò che UITableViewDelegate in UITableView.h fa:

// Class B 
@class ClassB; 

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

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

2) nella sottoclasse, aggiungere il protocollo originale al fianco di quello nuovo:

// Class B 
@protocol ClassBDelegete; 

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

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

presumo (1) funziona come Apple ha farlo in questo modo, L'opzione (2) rimuove l'avviso ma non ho compilato ed eseguito nulla in questo modo.

Problemi correlati