[ios]从子类在超类上设置属性吗?

发布时间: 2017/3/21 23:26:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我工作的一个子类 SKNode 调用UtilityNode

@implementation UtilityNode

- (id)initWithName:(NSString *)rootName {
    self = [super init];
    if(self) {
        [self setName:rootName]; // ?
    }
    return self;
}

@end

我设置了新的节点指定 initialiser initWithName: 在哪里我要初始化的超类名称 SKNode 时创建新的子类。我的印象是,我可以只是写下了 _name = rootName; 但 _name 被标记为未申报。这件有工作 (正如你可以看到以上),通过使用 [self setName:rootName]; 可以任何人一些光芒在这方面,我这样做正确吗?

解决方法 1:

这是正确的。_name的实例变量可能被声明为 @private (自动合成属性的默认值),因此它是无法访问的子类。

在设计良好的类层次结构和具体框架类,那里是没有源代码可用你会发现大部分如果不是所有的实例变量访问由子类因为它隐藏实现细节,使未来更改基类可能。想象一下如果基类所需验证的名称属性,只要它发生变化 — — 如果子类可以直接向他们会绕过检查添加到埃法尔 setter 方法埃法尔分配。

PS︰ 我找到点符号更友好的眼睛︰

 self.name = rootName;

更新关于"不要将消息发送到 self 在 init/dealloc"规则︰

这很容易可以避免通过重新设计要不带非必需参数在其 init 方法的类。这个子类清洁版本将是︰

UtilityNode* un = [UtilityNode node];
un.name = @"some name";

如果节点绝对需要要设置的参数,警告用户通过 NSAssert 在那里要求名称是有效的方法。

官方微信
官方QQ群
31647020