我一直在试图找到一种解决方法,在Objective-C中声明@protected属性,这样只有层次 struct 中的子类才能访问它们(只读,而不是写).
层次 struct 顶部的每个自定义类都包含三个类、一个实现和两个接口.
ClassA.h
ClassA_protected.h
ClassA.m
那么这个ClassA的任何子类都会像往常一样:
ClassB.h
ClassB.m
首先,我创建了接口ClassA.h,在这里我声明了一个受保护的int变量,这样ClassA的任何子类都可以访问它:
@interface ClassA : NSObject{
@protected
int _myProtectedInt;
}
@end
下一步是我刚才提到的解决方法.然而,一旦你读了它,你就会发现它非常直截了当.我声明了第二个名为ClassA_protected.h的接口,它实际上是ClassA的extension.h并允许我们将该房产标记为readonly
:
#import "ClassA.h"
@interface ClassA ()
@property (nonatomic , readonly) int myProtectedInt;
@end
准备受保护层次 struct 的最后一步是在ClassA.m中声明它的实现,我们只合成我们的属性:
#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end
这样,每个需要是ClassA.h的子类的类都将导入ClassA_protected.h.因此,一个像ClassB.h这样的子元素应该是这样的:
#import "ClassA_protected.h"
@interface ClassB : ClassA
@end
以及从ClassB.m的实现中访问此属性的示例:
@implementation ClassB
-(void) method {
//edit protected variable
_myProtectedInt= 1;
//normal access
self.muProtectedInt;
}
@end