its*_*ode 2 design-patterns initialization objective-c
我正在阅读" 可可设计模式 " 一书,其中有两点,在第3章(两阶段创作)让我感到困惑.
确保重写超类"指定初始化程序"以调用新的指定初始化程序.
在子类化时,确保每个不是指定初始化程序的新初始化程序都调用指定的初始化程序.
我的问题是我们如何调用我们没有参数传递的方法?书中的例子正在下面发布.在这个方法中,writer已经传递了一些"静态"值,但是我们应该这样做吗?或者这总是可取的吗?
我的第二个问题是,为什么我必须覆盖超类的指定方法,当我将初始化我的对象时,我将永远不会调用它,除了在我自己的指定初始化器中,我将不会传递任何参数(例如; in) 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];
}
Run Code Online (Sandbox Code Playgroud)
还请帮我纠正我的问题,因为我不确定我真正问的是一个正确的问题.
谢谢.
指定的初始化程序是正确配置对象的初始化程序.如果你没有选择一个init ...方法作为指定的初始化程序,那么你必须确保每个init ...方法都做对了.这通常意味着它们都必须具有相同的代码,或者它们都必须调用常用的设置方法.这也意味着任何对类进行子类化的人都必须覆盖所有init ...方法,而不是只覆盖一个.
通过选择(即"指定")一个init ...方法作为所有其他方法调用的常用方法,您可以为子类提供单个覆盖点和单个方法,这些方法可以通过自己的init ...方法调用以确保超类配置正确.
如果您没有调用指定初始化程序所需的数据,则您没有设置超类所需的数据.有时您可以选择合理的默认值,如上所述,但如果没有,那么创建手头的对象没有任何意义.
归档时间: |
|
查看次数: |
1092 次 |
最近记录: |