繁体   English   中英

Objective-C:继承受保护/私有原子属性

[英]Objective-C: inheriting protected/private atomic property

说,我有C,D类,它们的定义如下:

@interface C:NSObject 
@end

@interface D:C 
@end

我的目标是原子属性P添加到C类以这样的方式,也只会是可见的和可用d内部类(及其衍生物)。

最好的方法是什么?

PS该属性必须在D中是原子的。

在Objective-C中,没有直接支持受保护的属性或方法。 但是,有一种惯例可以做到这一点。 像抽象方法一样-如果有人愿意,他可以轻松地违反它。

您可以在.m文件中定义要保护的属性。

@interface DemoObject ()
    @property NSString *protectedString;
@end

@implementation DemoObject
    //implementation of the class
@end

该属性是原子的 -这是默认设置。

然后,您从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的扩展,将扩展DemoObject的属性暴露给InheritingObject 使用DemoObject任何对象都看不到protectedString属性,因为它没有在其.h文件中定义。 看到属性的类是定义DemoObject扩展的类。

实际上,您可以通过这种方式将属性公开给任何类,而不仅仅是派生类。 因此很容易打破这一约定。 但是,它会产生某种顺序,并产生一种受保护范围的错觉。

您可以不用重复进行操作,因此更容易处理:

CH:

@interface C : NSObject
…
@end

创建另一个头文件:

C_Protected:

@interface C()
@property id protecedVisibility;
@end

厘米

@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation

DM:

#import "C.h"
#import "C_Protected.h"

然后,您可以轻松地编辑受保护的部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM