【问题标题】:objective-c rename/override parent property?objective-c 重命名/覆盖父属性?
【发布时间】:2014-07-05 19:33:23
【问题描述】:

是否有一种简单的方法可以重命名父属性或让新属性重用现有属性?

例如,我有一个这样定义的父类:

@interface Parent : NSObject
    @property NSString* Name;
@end

如果我希望子类使用该 Name 属性但将其命名为其他名称,我知道我可以这样做:

@interface Child : Parent
    @property NSString* ChildName;
@end

@implementation Child

- (void) setChildName:(NSString *)ChildName
{
    [super setName:ChildName];
}

- (NSString *) ChildName
{
    return [super Name];
}

@end

但是有没有更简单的方法来使用 getter/setter 呢?这对我不起作用:

@interface Child : Parent
    @property (getter=Name, setter=setName) NSString* ChildName;
@end

【问题讨论】:

  • 请阅读developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…并正确命名您的方法和变量。
  • 我有,而且我从未见过这样的部分详细说明。我错过了吗?
  • 我建议将其作为旁白阅读。您最初的问题可能与此有关,也可能无关,但它肯定会让其他人更容易帮助您解决问题。

标签: ios objective-c oop


【解决方案1】:

Oren 是正确的,您需要了解一些属性,但您可以尝试像这样设置 getter/setter:

@interface Child : Parent
    @property (getter=childName, setter=setChildName) NSString* Name;
@end

您可能还希望在属性描述中添加(强的、非原子的)(或任何适合您的上下文的内容)。

【讨论】:

  • 但这实际上并没有覆盖父级的实现,对吧?这意味着如果我有一个 Child 的实例,如果我调用 myChild.Name,它将起作用,因为该属性正在使用 ChildName。但是,如果我将该 Child 转换为其 Parent,则 myParent.Name 将返回 nil,因为该属性从未真正设置过。
  • 但是可以在子类中合成。
  • 或许这篇相关的帖子会对你有所帮助:stackoverflow.com/questions/17127056/…
  • 这基本上就是我上面所做的,孩子只是称之为超级版本。我只是希望有一种更简单的方法,这样我就不必在孩子身上再次重新创建所有属性。指定 getter/setter 对我来说似乎是合乎逻辑的,但不确定为什么它不起作用
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 2010-09-27
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多