objective-c - Objective-C:继承受保护/私有原子属性
问题描述
比如说,我有 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
将我们需要的属性暴露给InheritingObject
. 任何使用的对象DemoObject
都看不到该protectedString
属性,因为它没有在其.h
文件中定义。看到该属性的类是那些定义DemoObject
' 扩展名的类。
实际上,您可以以这种方式将属性公开给任何类,而不仅仅是派生类。所以很容易打破这个约定。然而,它创造了某种秩序和受保护范围的错觉。
推荐阅读
- node.js - Discord.js:为什么“awaitMessages”在事件中不起作用:“准备好”?
- r - 如何使用 ggpairs 获得 R^2?
- javascript - React 中三元运算符样式的 null 或 undefined
- c# - 随机 ConfigurationBuilder 行为
- apache-kafka - 运行多个 Kafka 控制台消费者的最佳方式?
- neovim - 如何将错误从 Neovim LSP 发送到 ALE
- mysql - MySQL从一个表中选择一个值,并根据第一个表中的值对另一个表的值求和
- angular - 如何避免多次 API 调用
- r - 在 R 中识别两个字符串中的模式
- java - 原子序列的监听器