Objective-C:继承protected/private原子属性
Objective-C: inheriting protected/private atomic property
说,我有 classes C、D,它们的定义如下:
@interface C:NSObject
@end
@interface D:C
@end
我的目标是将 atomic 属性 P 添加到 class C 中,使其在 [=31= 内部可见和可用] D(及其派生词)仅.
最好的方法是什么?
PS 属性 必须 在 D.
中是原子的
Objective-C 中不直接支持受保护的属性或方法。但是,有一种方法可以按照惯例进行。就像抽象方法一样 - 如果有人想要,他可以很容易地违反它。
您在 .m
文件中定义要保护的 属性。
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation DemoObject
//implementation of the class
@end
属性 是 atomic - 这是默认值。
那么你继承自DemoObject
:
.h
文件
@interface InheritingObject : DemoObject
@end
.m 文件
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation InheritingObject
- (instancetype)init {
if (self == [super init]) {
self.protectedString = @"Some String";
}
return self;
}
@end
这里基本上发生的事情是我们创建了 DemoObject
的扩展,将我们需要的 属性 暴露给 InheritingObject
。任何使用 DemoObject
的对象都看不到 protectedString
属性,因为它未在其 .h
文件中定义。看到 属性 的 classes 是定义 DemoObject
扩展名的那些。
实际上,您可以通过这种方式将 属性 公开给 any class,而不仅仅是派生的。所以很容易打破这个约定。然而,它创造了某种秩序和受保护范围的错觉。
你可以不用重复,因此更容易处理:
C.h:
@interface C : NSObject
…
@end
创建另一个头文件:
C_Protected:
@interface C()
@property id protecedVisibility;
@end
C.m
@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation
D.m:
#import "C.h"
#import "C_Protected.h"
然后您就可以轻松编辑受保护的部分了。
说,我有 classes C、D,它们的定义如下:
@interface C:NSObject
@end
@interface D:C
@end
我的目标是将 atomic 属性 P 添加到 class C 中,使其在 [=31= 内部可见和可用] D(及其派生词)仅.
最好的方法是什么?
PS 属性 必须 在 D.
中是原子的Objective-C 中不直接支持受保护的属性或方法。但是,有一种方法可以按照惯例进行。就像抽象方法一样 - 如果有人想要,他可以很容易地违反它。
您在 .m
文件中定义要保护的 属性。
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation DemoObject
//implementation of the class
@end
属性 是 atomic - 这是默认值。
那么你继承自DemoObject
:
.h
文件
@interface InheritingObject : DemoObject
@end
.m 文件
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation InheritingObject
- (instancetype)init {
if (self == [super init]) {
self.protectedString = @"Some String";
}
return self;
}
@end
这里基本上发生的事情是我们创建了 DemoObject
的扩展,将我们需要的 属性 暴露给 InheritingObject
。任何使用 DemoObject
的对象都看不到 protectedString
属性,因为它未在其 .h
文件中定义。看到 属性 的 classes 是定义 DemoObject
扩展名的那些。
实际上,您可以通过这种方式将 属性 公开给 any class,而不仅仅是派生的。所以很容易打破这个约定。然而,它创造了某种秩序和受保护范围的错觉。
你可以不用重复,因此更容易处理:
C.h:
@interface C : NSObject
…
@end
创建另一个头文件:
C_Protected:
@interface C()
@property id protecedVisibility;
@end
C.m
@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation
D.m:
#import "C.h"
#import "C_Protected.h"
然后您就可以轻松编辑受保护的部分了。