为什么要覆盖超类的指定初始值设定项?

时间:2011-04-22 06:57:16

标签: objective-c design-patterns initialization

我正在阅读“Cocoa Design Pattern”一书,其中有两点,第3章(两阶段创作)让我感到困惑。

  1. 确保覆盖超类“指定初始化程序”以调用新的指定初始化程序。

  2. 在进行子类化时,请确保每个不是指定初始化程序的新初始化程序都调用指定的初始化程序。

  3. 我的问题是我们如何调用我们没有参数传递的方法?书中的例子正在下面发布。在这个方法中,writer已经传递了一些“静态”值,但是我们应该这样做吗?或者这总是可取的吗?

    我的第二个问题是,为什么我必须覆盖指定的超类方法,当我将初始化我的对象时,我将永远不会调用它,而不是在我自己的指定初始化器中,我将不会传递任何参数(例如;在NSObject的情况下)

    @interface MYCircle : NSObject {
    
    NSPoint center;
    
    float   radius; 
    
    }
    
    // Designated Initializer 
    
    - (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius;
    
    @end 
    
    @implementation MYCircle
    
    // Designated Initializer 
    
    - (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius {
    
    self = [super init];
    
    if(nil != self) {
    
    center = aPoint;
    
    radius = aRadius; 
    
    }
    
    return self; 
    
    }
    
    @end
    
    
    
    // Overriden inherited Designated Initializer 
    - (id)init {
    
    static const float MYDefaultRadius = 1.0f;
    
    // call Designated Initializer with default arguments
    
    return [self initWithCenter:NSZeroPoint radius:MYDefaultRadius]; 
    
    }
    

    还请帮我纠正我的问题,因为我不确定我真正问的是一个正确的问题。

    感谢。

1 个答案:

答案 0 :(得分:6)

指定的初始值设定项是正确配置对象的初始值设定项。如果你没有选择一个init ...方法作为指定的初始化程序,那么你必须确保每个init ...方法都做对了。这通常意味着它们都必须具有相同的代码,或者它们都必须调用常用的设置方法。这也意味着任何对类进行子类化的人都必须覆盖所有的init ...方法而不是仅仅一个。

通过选择(即“指定”)一个init ...方法作为所有其他方法调用的常用方法,您为子类提供单个覆盖点和单个方法,它们自己的init ...方法可以调用以确保正确配置了超类。

如果您没有调用指定初始值设定项所需的数据,则您没有设置超类所需的数据。有时您可以选择合理的默认值,如上所述,但如果没有,那么创建手头的对象没有任何意义。