【问题标题】:How to set the superclass instance within the initialization of subclass如何在子类的初始化中设置超类实例
【发布时间】:2013-07-27 09:11:30
【问题描述】:

我很好奇怎么做而不是做:

- (id)init {
    if ((self = [super init])) {
         //initialize subclass objects
    }
    return self;
}

通过传递超类对象的边界来初始化子类

- (id)initWithSuperclass:(Superclass *)superclassObject {
    if ((self = superclass)) {
        //initialize subclass objects
    }
    return self;
}

这可能吗?如果可以,我应该避免这种情况吗?对我来说,它散发着臭代码,但我没有看到另一种在不知道超类中的每个数据字段的情况下将超类对象的所有数据字段传递给子类初始化的方法。

是否有人遵循我的想法/能够帮助我解决这个...臭代码?

编辑:

好的,假设我在下面有 A 类和 B 类:

@interface A
    //stuff but we don't know what
end

@implementation A

- (id)init {
    if (self = [super init]) {
         //initialize A "stuff"
    }
    return self;
}

end

@interface B : A  
    @property (nonatomic, retain) UIButton* one;
    - initWithA:(A*)superclassObject;
end

@implementation B

- (id)initWithA:(A*)superclassObject {
    if ((self = superclassObject)) {
        one = [[UIButton alloc] init];
    }
    return self;
}

end

我正在寻找这样做的好处是,在 A 类中,我不知道所有数据字段,因为它不是我可以访问的代码/代码。但是,我确实需要扩展该类。我希望能够通过在可能是类的对象实例的一部分的任何数据值/对象之上引入 B 类的新数据值(如上例中的“UIButton one”),将 A 类的实例更改为 B 类A.

【问题讨论】:

  • 我想我不明白你想要达到什么目的。您能否给出一个具体的代码示例,您认为在第一个示例中不起作用,但在第二个示例中起作用?
  • 我将我的问题编辑为(我认为的)更具体。我添加了一个 A 类 - B 类代码示例。
  • 这还是很难理解的。让我们调用您提供变体 1 和 2 的两个初始化程序。在您的示例代码中,您将展示如何使用变体 2 创建一个 UIButton 实例。我不明白为什么你不能对变体 1 做同样的事情。另外,你说“我希望能够将 A 类的实例更改为 B 类”。这是否意味着您无法控制正在创建A 的实例,并且您想以某种方式将那些已经存在的实例更改为B 的实例?
  • 好的,假设我有一个 UIButton。我将该 UIButton 子类化为 MYButton。现在我想获取我已经拥有的 UIButton 对象并将它们转换为 MYButton 对象。由于我不确定 UIButton 的所有数据字段,这可能吗?根据 CRD,它不是。

标签: objective-c oop superclass


【解决方案1】:

忽略运行时的晦涩高级功能,您尝试做的事情在 Objective-C 中是不可能的 - 您不能将对象实例从超类动态扩展为子类实例,在流程中添加实例变量。

思考而不是“有一个”模型 - 其中B 不是A 的子类,但具有A 类型的实例变量/属性。

HTH

附录

看到关于MYButtonUIButton 的新cmets,为什么要创建UIButton 实例?如果您使用 Interface Builder/Xcode 来生成您的 UI,那么您可以直接构建您的 MYButtons - 在设计器中选择一个 UIButton 并将其类更改为 MYButton,请参阅文档了解如何,然后您将直接创建您的实例。

【讨论】:

  • 您是说将其视为“拥有”模型吗?你说认为而不是模型...然后不清楚你建议我认为它是什么。
  • 我的意思是你应该考虑使用“有一个”模型来解决你的问题。
  • 所以你是说我应该让 B 包含 A 的属性,而不是继承 A?
  • 我只是建议您将其作为一种选择。
  • 我很喜欢这个选项并且已经想到了,不幸的是,我通过子类化解决的实际问题是 UIButton.titleLabel 是只读的,所以我用一个标签替换那个标签(1 ) 默认情况下为 CGRect 大小处理它自己的布局/字体,或者可以准确地告诉它如何在 UIButton 子类中进行布局。由于我必须重写 UIButton 中的方法,并且仍然让其他所有对象都将我的对象视为 UIButton,因此我必须将其子类化。对于看到这个问题的其他人来说,这很可能是他们正在寻找的解决方案。感谢您回答我的问题。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多