Objective C - 使用多个init方法对类进行子类化

时间:2010-07-11 00:59:09

标签: objective-c methods subclassing init

我正在寻找一种向多个init方法添加新参数的便捷方法。它有点难以描述但我的问题如下:

我有一个类巫婆实现各种init方法。 f.e。

@interface Circle {
    CGPoint   center;
    float   radius;
}
- (id)initWithCenter:...radius:...;
- (id)initWithRect:...;  
- (id)initWithPoly:...;

现在f.e.我想创建一个十字准线作为子类。所以我想添加一些行作为实例变量。所以问题是,每个十字准线对象都必须用一些特定值初始化,但当然初始化圆的方法不会改变。所以我想从超类中获取每个init-method,但是将这些特定参数添加到每个类中。

直接的方式(在我没有经验的眼中)是覆盖巫婆中的每一种方法然后调用相应的超级方法然后做我的东西。但是,如果你有10个或更多的init方法并且只想为每个方法添加相同的参数,这非常烦人。所以即时通讯询问是否有更好的方法来实现这一目标?要么能够修改超类,要么没有。

非常感谢

1 个答案:

答案 0 :(得分:1)

通常,您有一个{em}指定初始化程序的init*方法变体。所有其他init*方法都会调用该方法,然后执行他们需要的任何自定义。子类通常会添加新的init*变体,在指定的初始化程序中调用[self init*],因为子类将首先覆盖指定的初始化程序(以及其他所需的初始化程序)。< / p>

然而,这很快就会完全失控。对于你的圈子,你似乎只是想要:

- (id)initWithCenter:...radius:...;

然后会创建一系列便利工厂方法来处理其他类型:

+ circleInRect:...;

(我怀疑你的代码是一个人为的例子,否则我也会指出奇怪的是“十字准线”类作为“圆”类的子类。对于类似的东西,我可能会从一个Shape类,然后添加CircleCrosshair作为Shape的子类。显然,Sketch示例非常相关。)