我很好奇如何代替:
- (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,无论数据值/对象可能是类的对象实例的一部分甲
答案 0 :(得分:1)
忽略运行时的模糊高级功能,在Objective-C中不可能执行的操作 - 您无法将对象实例从超类动态扩展到在进程中添加实例变量的子类实例。
考虑而不是“有一个”模型 - 其中B
不是A
的子类,但具有类型为A
的实例变量/属性。
HTH
<强>附录强>
查看有关MYButton
vs UIButton
的新评论,为什么要创建UIButton
个实例?如果您使用Interface Builder / Xcode生成UI,那么您可以直接构建MYButton
- 在设计器中选择UIButton
并将其类更改为MYButton
,请参阅相关文档如何,然后你将直接创建你的实例。