在继承一个类的同时,我还想继承父类的委托,因为子类现在具有附加功能。要做到这一点,最好的方法是什么?如果我只是声明另一个代表属性在子类中使用相同的名字,我会得到一个警告“物业类型‘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. 如何在swift中指定仅在委托(继承)中的可用性?
- 4. 如何正确地继承QApplication?
- 5. 如何正确地继承scipy.sparse矩阵?
- 6. 正确地继承EKEvent类
- 7. 正确地继承UITableViewCell?
- 8. C#属性委托?
- 9. xsl:属性集不能从xsl:属性集正确继承
- 10. 在WPF中继承属性
- 11. 试图实现委托继承
- 12. UrlClassLoader委托和继承层次结构
- 13. 虚拟继承和委托实现
- 14. 接口/继承/委托设计问题
- 15. 继承属性
- 16. 如何从annonymus委托获取属性
- 17. 如何在UINavigationController中正确地继承UITableViewController?
- 18. 如何在Python中通过继承正确地启动子类?
- 19. 如何正确地在iOS中继承UITextField?
- 20. 如何正确委托对象?
- 21. 如何继承OCaml中的属性?
- 22. Groovy:在枚举中委托属性
- 23. 委托方法属性
- 24. 如何确定哪个Python类在继承时提供属性
- 25. 为继承属性
- 26. 继承css属性
- 27. 继承CSS属性
- 28. 如何从不从EventHandler继承的委托创建IObservable?
- 29. 继承属性没有继承
- 30. 更正未继承的属性的CSS继承行为?
我用后者的路线(继承了主类后的委托协议的子类),但无法在不触发编译器错误的情况下声明另一个委托属性。您提到的方法声明是让编译器高兴的唯一方法吗? – Boon 2012-03-19 11:29:17
我不知道有任何其他的方式来做到这一点。 – 2012-03-19 17:04:25