1

这篇博文之后,我看到了一种解决我面临的问题的方法。

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

@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

我想知道是否还有另一种方法可以将属性声明为受保护?

4

2 回答 2

3

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

于 2014-01-24T22:54:15.173 回答
1

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

@interface A (Protected)

@property (nonatomic, readonly) NSUInteger prop;

@end

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

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

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

于 2014-01-24T22:54:38.190 回答