在繼承一個類的同時,我還想繼承父類的委託,因爲子類現在具有附加功能。要做到這一點,最好的方法是什麼?如果我只是聲明另一個代表屬性在子類中使用相同的名字,我會得到一個警告「物業類型‘ID’是類型不兼容‘身份證’,從‘父類’如何在Objective-C中正確地繼承委託屬性?
7
A
回答
1
遵循NSTableView
和NSOutlineView
的例子繼承。
NSOutlineView
是NSTableView的的一個子類,並定義它自己的協議,用於其dataSource
和delegate
NSTableView
聲明它代表這種方式:
- (void)setDelegate:(id <NSTableViewDelegate>)delegate;
- (id <NSTableViewDelegate>)delegate;
和NSOutlineView
:
- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject;
- (id <NSOutlineViewDelegate>)delegate;
顯然,編譯器是更寬鬆裸方法聲明比它與屬性聲明。
與NSTable/OutlineView不同,您可能希望使子類的協議從基類的協議繼承,例如,
@protocol SpecializedProtocol <BaseProtocol>
......這可能取決於情況。
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)在子類中,將協議定義放在類定義之前。這是UITableViewDelegate
在UITableView.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)刪除警告,但我沒有編譯和運行任何設置這種方式。
相關問題
- 1. 如何正確設置委託屬性? (swift)
- 2. 在C#中使用委託作爲屬性是否正確?
- 3. 如何正確地繼承QApplication?
- 4. 如何正確地繼承scipy.sparse矩陣?
- 5. 正確地繼承UITableViewCell?
- 6. 正確地繼承EKEvent類
- 7. C#屬性委託?
- 8. 在WPF中繼承屬性
- 9. 虛擬繼承和委託實現
- 10. 接口/繼承/委託設計問題
- 11. 繼承屬性
- 12. 如何在UINavigationController中正確地繼承UITableViewController?
- 13. 如何正確地在iOS中繼承UITextField?
- 14. 如何在Python中通過繼承正確地啓動子類?
- 15. 如何從annonymus委託獲取屬性
- 16. 如何繼承OCaml中的屬性?
- 17. Groovy:在枚舉中委託屬性
- 18. 委託方法屬性
- 19. 如何確定哪個Python類在繼承時提供屬性
- 20. 繼承css屬性
- 21. 爲繼承屬性
- 22. 繼承CSS屬性
- 23. 如何從不從EventHandler繼承的委託創建IObservable?
- 24. 更正未繼承的屬性的CSS繼承行爲?
- 25. Square是否正確地從Rectangle繼承?
- 26. 如何映射繼承與屬性返回其他繼承?
- 27. 如何在Xaml中使用委託類型屬性?
- 28. 如何在委託事件中獲取表單ID屬性
- 29. 何時調用引用屬性「委託」?
- 30. <button>不是繼承的CSS屬性正確
我用後者的路線(繼承了主類後的委託協議的子類),但無法在不觸發編譯器錯誤的情況下聲明另一個委託屬性。您提到的方法聲明是讓編譯器高興的唯一方法嗎? – Boon 2012-03-19 11:29:17
我不知道有任何其他的方式來做到這一點。 – 2012-03-19 17:04:25