0

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

我有一个班级女巫实现了各种初始化方法。铁

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

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

直接的方法(在我没有经验的眼里)是覆盖女巫中的每个方法,然后调用相应的超级方法,然后做我的事情。但是,如果您有 10 个或更多的 init 方法并且只想为每个方法添加相同的参数,这将非常烦人。所以我问是否有更好的方法来实现这一点?有或没有修改超类的能力。

多谢

4

1 回答 1

1

通常,您有一种init*方法变体,即指定的初始化程序。所有其他init*方法都调用该方法,然后进行所需的任何自定义。子类通常要么添加init*调用[self init*]指定初始化器的新变体作为第一件事,要么子类器将覆盖指定的初始化器(和其他需要的)。

但是,这很快就会完全失控。对于你的圈子,看起来你真的只是想要:

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

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

+ circleInRect:...;

(我怀疑你的代码是一个人为的例子,否则我也会指出“十字准线”类作为“圆”类的子类的奇怪之处。对于类似的事情,我可能会从一个Shape类开始,然后添加CircleCrosshair作为Shape的子类。显然,这个Sketch例子是高度相关的。)

于 2010-07-11T03:18:08.270 回答