代码之家  ›  专栏  ›  技术社区  ›  Tobi

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

  •  0
  • Tobi  · 技术社区  · 14 年前

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

    我有一个类开关实现各种初始化方法。F.E.

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

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

    直接的方法(在我没有经验的眼睛里)是覆盖巫婆中的每个方法,然后我调用根据超级方法,然后做我的事情。但是,如果您有10个或更多的init方法,并且只想向每个方法添加相同的参数,那么这非常烦人。所以我问是否有更好的方法来完成这一点?可以修改超类,也可以不修改超类。

    谢谢

    1 回复  |  直到 12 年前
        1
  •  1
  •   eonil    12 年前

    一般来说,你有一个 init* 方法变量,即 指定初始化 . 所有其他 初始化 方法调用该方法,然后执行它们需要的任何定制。子类通常要么添加新的 初始化 调用的变量 [self init*] 在指定的初始值设定项上作为第一件事 子类将重写指定的初始值设定项(以及其他必要的)。

    然而 这会很快完全失控。对于你的圈子来说,它真的像你 只是 想要:

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

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

    + circleInRect:...;
    

    (我怀疑您的代码是一个人为的例子,否则我也会指出一个奇怪的地方,即作为“circle”类的子类的“crosshair”类。对于类似的事情,我可能会从 Shape 类,然后添加 Circle Crosshair 作为形状的一个子类。显然, Sketch 示例非常相关。)