在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
我想知道的是,是否有其他方法可以将属性声明为受保护的?
答案 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文件中创建一个类别,该文件公开了一个公共属性。这种方式它与主公共接口分离,因为无论如何都可以访问私有属性,我认为这种方法已经足够了。