将属性声明为受保护的更好方法

时间:2014-01-24 22:48:16

标签: objective-c inheritance properties ivar

this blog post之后,我看到了一种方法来解决我面临的问题。

我的问题就像他一样,我有一个具有必须在其子类中继承和访问的属性的类:

@interface A : NSObject
@property (nonatomic, readonly) NSUInteger prop;
@end

@implementation A
    // Don't need to synthesize nowadays
@end

@interface B : A
    // No new properties
@end

@implementation B

- (void)establishValueForProp
{
    _prop = 1; // PROBLEM !!!
}

@end

解决方案是:

@interface A : NSObject {
    @protected
    NSUInteger _prop;
}
@property (nonatomic, readonly) NSUInteger prop;
@end

我想知道的是,是否有其他方法可以将属性声明为受保护的?

2 个答案:

答案 0 :(得分:3)

我通常这样做的方法是创建第二个标题,例如“ClassName_ForSubclasses.h”。在该头文件中,添加一个类扩展,其中包含您希望子类能够调用和覆盖的属性和方法。然后,子类可以导入该标头,而类的其他用户则看不到它。

答案 1 :(得分:1)

另一种常见的方法是创建一个单独的.h文件(例如ASubclass.h)并添加如下内容:

@interface A (Protected)

@property (nonatomic, readonly) NSUInteger prop;

@end

然后子类可以导入.h并且可以访问此方法。请注意,由于类别无法添加属性,因此您必须在A的私有interface(类扩展名)中重新定义此属性。然后,该类别将提供对此属性的公共访问权限。 Apple采用UIGestureRecognizer.h和UIGestureRecognizerSubclass.h(其中UIGestureRecognizer.h公开了更多方法,用于子类覆盖)来采用这种精确方法。

受保护(或私有)方法的概念并不存在,这只是一种在某种程度上实现类似功能的方法。

就个人而言,我只是在类的(仅).h文件中创建一个类别,该文件公开了一个公共属性。这种方式它与主公共接口分离,因为无论如何都可以访问私有属性,我认为这种方法已经足够了。