在继承一个类的同时,我还想继承父类的委托,因为子类现在具有附加功能。要做到这一点,最好的方法是什么?如果我只是声明另一个代表属性在子类中使用相同的名字,我会得到一个警告“物业类型‘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