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
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.
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.
- 1. Come implementare correttamente una proprietà in F #?
- 2. Come cast correttamente nella sottoclasse in Swift?
- 3. Sottoclasse UITableViewCell correttamente?
- 4. Come creare una classe, sottoclasse e proprietà in Lua?
- 5. Creare sottoclasse con differenti proprietà sottoclasse
- 6. Come implementare correttamente onRestoreInstanceState() per una sottoclasse DialogPreference?
- 7. Come sottoclasse UINavigationBar correttamente utilizzando anche l'aspetto
- 8. Delegata transizione per animazione UITabBarController
- 9. Particolari sull'azione delegata in C#
- 10. Come dividere newline da NSString in ObjectiveC
- 11. Uso delle funzioni lambda C++ 11 in ARC ObjectiveC++ - come farlo correttamente?
- 12. Sottoclasse UIButton - Impostazione delle proprietà?
- 13. Implementare protocollo ObjectiveC in rapida
- 14. ObjectiveC blocca l'equivalente Java
- 15. Sottoclasse Matlotlib Testo: manipolazione proprietà dell'artista figlio
- 16. Come sovrascrivere correttamente un metodo di classe in un Objective-C in una sottoclasse?
- 17. Come sottoclasse correttamente dict e override __getitem__ & __setitem__
- 18. Come si scrive e si utilizza correttamente una sottoclasse Visualizza in Android?
- 19. Come utilizzare JAXB @XmlValue in una sottoclasse?
- 20. Come creare una sottoclasse in C#?
- 21. Animazione di una proprietà personalizzata della sottoclasse CALayer
- 22. Override proprietà di sola lettura nella sottoclasse
- 23. perché super.getClass() in una sottoclasse restituisce il nome della sottoclasse
- 24. Serializzazione GWT di una sottoclasse
- 25. Come implementare il bridging senza pedaggio in ObjectiveC/C?
- 26. Come posso ridichiarare una proprietà come read-write nella sottoclasse UIResponder con swift?
- 27. Sottoclasse CALayer che non si anima alle modifiche delle proprietà
- 28. Che cos'è una sottoclasse
- 29. Evidenziazione una sottoclasse UIControl
- 30. Proprietà colonne non allineate correttamente
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
Non conosco nessun altro modo per farlo. –