W podklasach klasy, chcę również podklasy delegata klasy nadrzędnej, ponieważ podklasa ma teraz dodatkową funkcjonalność. Jaki jest najlepszy sposób na zrobienie tego? Jeżeli po prostu zadeklarować inną właściwość delegata w podklasie o tej samej nazwie, że dostanę ostrzeżenie „typ obiektu«id»jest niezgodny z typem«id»odziedziczony«ParentClass»Jak prawidłowo podklasować właściwość delegata w Objective-C?
Odpowiedz
śladem NSTableView
i NSOutlineView
.
NSOutlineView
jest podklasą NSTableView i definiuje swój własny protokół ze swojej dataSource
i delegate
NSTableView
deklaruje jego delegat w ten sposób:.
- (void)setDelegate:(id <NSTableViewDelegate>)delegate;
- (id <NSTableViewDelegate>)delegate;
i NSOutlineView
:
- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject;
- (id <NSOutlineViewDelegate>)delegate;
Najwyraźniej kompilator jest bardziej wyrozumiały gołymi deklaracji metody niż to z deklaracji majątkowych.
W przeciwieństwie do NSTable/OutlineView, możesz chcieć, aby protokół klasy podrzędnej dziedziczył z protokołu klasy bazowej, np.
@protocol SpecializedProtocol <BaseProtocol>
... prawdopodobnie zależy to od sytuacji.
Biorąc pod uwagę ten przykład, który generuje ostrzeżenie:
// 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
dwa rozwiązania, które usuwają ostrzeżenia są.
1) W podklasie umieść definicję protokołu przed definicją klasy. To co UITableViewDelegate
w UITableView.h
robi:
// Class B
@class ClassB;
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate;
@end
2) W podklasie, należy dodać oryginalny protokół wraz z nowym:
// Class B
@protocol ClassBDelegete;
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate;
@end
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
Zakładam (1) działa jak jabłko zrobić to w ten sposób, Opcja (2) usuwa ostrzeżenie, ale nie skompilowałem i nie uruchomiłem niczego w ten sposób.
- 1. Jak prawidłowo podklasować dyktować i nadpisywać __getitem__ & __setitem__
- 2. Jak podklasować OrderedDict?
- 3. Właściwość "przypisz" i "zatrzymaj" dla delegata
- 4. Jak podklasować klasę tablicową w Swift?
- 5. Wdrożenie ObjectiveC protokół w szybkim
- 6. Czy można podklasować EventSource w ETW?
- 7. ObjectiveC Parse Integer from String
- 8. Jak łączyć Lambda Delegata
- 9. Jak utworzyć delegata dla QTreeWidget?
- 10. Jak czekają na async delegata
- 11. Jak ustawić delegata w innej klasie?
- 12. ObjectiveC: gdzie zadeklarować prywatne właściwości instancji?
- 13. Dodawanie delegata w języku C#
- 14. Jak podklasować kontroler nawigacyjny podczas korzystania ze scenorysów?
- 15. Po prostu ciekawy jak podklasować obiekt String. (prototypowo)
- 16. Jak prawidłowo używać gluLookAt?
- 17. Jak prawidłowo używać Dispatcher.BeginInvoke?
- 18. Jak prawidłowo zamknąć log4j2
- 19. Jak prawidłowo ustawić UIRequiredDeviceCapabilities?
- 20. Jak prawidłowo wywołać IL2JS?
- 21. Jak prawidłowo używać cin.peek()
- 22. W jaki sposób mogę podklasować uchwyt IO :: Perl 6?
- 23. Jak wyczyścić: oba; prawidłowo?
- 24. Metoda delegata NSURLConnection
- 25. Czy czas wywołania metody super klasy jest ważny w ObjectiveC?
- 26. Uzyskiwanie delegata from methodinfo
- 27. startowych z protokołem delegata
- 28. UIAlertViewStylePlainTextInput klucz powrotny delegata
- 29. Kolejka delegata NSURLSession Kolejka
- 30. Jak zaimplementować właściwość w interfejsie
Poszedłem z tą drugą trasą (podklasa, protokół delegata po podklasie głównej klasy), ale nie udało się zadeklarować innej właściwości delegata bez wywoływania błędu kompilatora. Czy deklaracje metod, które wymieniłeś, są jedynym sposobem na uszczęśliwienie kompilatora? – Boon
Nie znam innego sposobu, aby to zrobić. –