【发布时间】: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