Objective c 继承的@属性能否不满足<;协议>@财产?
我有一个协议:Objective c 继承的@属性能否不满足<;协议>@财产?,objective-c,cocoa,oop,cocoa-design-patterns,Objective C,Cocoa,Oop,Cocoa Design Patterns,我有一个协议: @protocol Gadget <NSObject> @property (readonly) UIView *view; - (void) attachViewToParent:(UIView *)parentView; @end 但是当我在AbstractGadget的子类中实现Gadget协议时,如下所示: // Concrete @interface BlueGadget : AbstractGadget <Gadget> { } -
@protocol Gadget <NSObject>
@property (readonly) UIView *view;
- (void) attachViewToParent:(UIView *)parentView;
@end
但是当我在AbstractGadget
的子类中实现Gadget
协议时,如下所示:
// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}
- (void) attachViewToParent:(UIView *)parentView;
@end
@implementation BlueGadget
- (void) attachViewToParent:(UIView *)parentView {
//...
}
@end
但我只是想知道我是在做不受支持的事情,还是不应该做的事情,或者只是编译器中的一个限制/缺陷?以下是objective-C中变量、属性和合成的规则: 如果你有一个属性,你必须有一个@synthesis,或者你声明@dynamic并自己编写getter和setter方法
因此,因为有一个名为view的属性,所以必须声明@synthesis。应该是这样。与@protocol,heritation无关通过将属性声明为@dynamic,您告诉编译器属性getter(和setter,如果需要)在其他地方实现(可能在运行时)。对我来说,这听起来是一个非常合理的用例
有关更多信息,请参阅 我也遇到了这个问题。这是@dynamic所适用的情况之一 对不起,我应该说得更具体些。在AbstractGadget中有一个“-(UIView*)视图”的完整实现。你能给我看看你在AbstractGadget实现中的代码吗。现在出现了一些问题,因为它通常适用于Messince,因为该属性是在子类中使用@dynamic的基类中实现的。+1与我的答案相同,但更好,并带有指向文档的链接。我必须使用Clang和Xcode 4来测试这一点,当我能够得到它们时。
// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}
- (void) attachViewToParent:(UIView *)parentView;
@end
@implementation BlueGadget
- (void) attachViewToParent:(UIView *)parentView {
//...
}
@end
- (UIView *) view {
return [super view];
}