1

我很好奇如何而不是这样做:

- (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 类一个。

4

1 回答 1

1

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

想想而不是“有一个”模型 - whereB不是的子类,A但具有类型的实例变量/属性A

高温高压

附录

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

于 2013-07-27T05:23:23.560 回答