首页 > 解决方案 > Objective-C:继承受保护/私有原子属性

问题描述

比如说,我有 C、D 类,它们的定义方式如下:

@interface C:NSObject 
@end

@interface D:C 
@end

我的目标是将原子属性 P 添加到 C 类中,使其在 D 类(及其衍生物)中可见和可用。

最好的方法是什么?

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

标签: objective-ccocoa

解决方案


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将我们需要的属性暴露给InheritingObject. 任何使用的对象DemoObject都看不到该protectedString属性,因为它没有在其.h文件中定义。看到该属性的类是那些定义DemoObject' 扩展名的类。

实际上,您可以以这种方式将属性公开给任何类,而不仅仅是派生类。所以很容易打破这个约定。然而,它创造了某种秩序和受保护范围的错觉。


推荐阅读