继承的@property不能满足<protocol> @property?</protocol>

时间:2010-07-21 01:55:32

标签: objective-c cocoa oop cocoa-design-patterns

我有一个协议:

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

- (void) attachViewToParent:(UIView *)parentView;

@end

一个“抽象”基类,带有-(UIView *)view的实现(作为getter,未显示):

// Base functionality
@interface AbstractGadget : NSObject {
    UIView *view;
}

@property (readonly) UIView *view;

@end

但是当我在Gadget的子类中实现AbstractGadget协议时,就像这样:

// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}

- (void) attachViewToParent:(UIView *)parentView;

@end


@implementation BlueGadget

- (void) attachViewToParent:(UIView *)parentView {
    //...
}

@end

我收到编译错误告诉我“警告:属性'视图'需要定义方法'-view'。”我可以使用@dynamic或添加存根方法使其消失:

- (UIView *) view {
    return [super view];
}

但我只是想知道我是在做一些不支持的事情,我不应该做的事情,或者它是否只是编译器中的限制/错误?

3 个答案:

答案 0 :(得分:5)

通过将属性声明为@dynamic,您告诉编译器属性getter(如果需要,则为setter)在其他地方实现(可能在运行时)。这听起来像是一个非常合理的用例。

有关详细信息,请参阅The Docs

答案 1 :(得分:2)

我也遇到过这个问题。这是@dynamic所针对的情况之一。

答案 2 :(得分:0)

以下是objective-C中变量,属性和合成的规则:

如果你有一个属性,你必须有一个@synthesize或你声明@dynamic并自己编写getter和setter方法。

因此,因为你有一个名为view的属性,你必须声明@synthesize。那应该是它。与@protocol,继承无关