代码之家  ›  专栏  ›  技术社区  ›  Sophistifunk

继承的@property不能满足<protocol>@属性吗?

  •  4
  • Sophistifunk  · 技术社区  · 14 年前

    @protocol Gadget <NSObject>
    
    @property (readonly) UIView *view;
    
    - (void) attachViewToParent:(UIView *)parentView;
    
    @end
    

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

    // 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
    

    我得到一个编译器错误告诉我“ @dynamic ,或添加存根方法:

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

    但我只想知道我是在做一些不受支持的事情,不应该做的事情,还是只是编译器中的一个限制/bug?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Alan Rogers    14 年前

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

    看到了吗 The Docs 更多信息。

        2
  •  2
  •   JeremyP    14 年前

        3
  •  0
  •   vodkhang    14 年前

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

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

    因此,因为有一个名为view的属性,所以必须声明@synthetic。应该是这样。与@protocol,inheritation无关