【问题标题】:Why override the designated initializer of super class?为什么要重写超类的指定初始化器?
【发布时间】:2011-04-22 06:57:16
【问题描述】:

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

  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]; 

}

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

谢谢。

【问题讨论】:

    标签: objective-c design-patterns initialization


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多