2011-04-22 67 views
2

我正在读的书“Cocoa Design Pattern”,其点2,第3章(两阶段创建)是让我困惑。为什么要重写超类的指定初始值设定项?

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

  2. 子类时,确保每一个新的初始化未在指定的初始化调用指定的初始化。

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

我的第二个问题是,为什么我必须重写超类的指定方法,当我将初始化我的对象时,我永远不会调用它,而不是在我自己指定的初始化器中,在那里我不会传递任何参数(例如,在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]; 

} 

也请帮我纠正了我的问题,因为我不知道我要问的是一个正确的问题。

谢谢。

回答

6

指定初始化是一些适当的配置对象中的一个。如果你不选择一个初始化...方法为指定初始化,那么你必须确保每一个初始化...方法做正确的事。这通常意味着它们都必须具有相同的代码,或者它们都必须调用通用的设置方法。这也意味着任何继承类的人都必须覆盖所有的init ...方法而不是一个。

通过拾取(即“指定”)一个初始化...方法,所有的人打电话,你给一个子类覆盖单点和自己的init ...方法可以调用一个方法的常用方法确保超类正确配置。

如果你没有必要调用指定的初始化数据,那么你就必须建立超所需要的数据。有些索引可以选择合理的默认值,如上所述,但如果不是,那么创建手头的对象没有任何意义。

相关问题