gpt4 book ai didi

objective-c - 覆盖 `init` 方法时,为什么重新定义它很重要?

转载 作者:太空狗 更新时间:2023-10-30 04:01:09 25 4
gpt4 key购买 nike

我有一个重写 init 方法的练习,所以我需要创建一个 init 方法来设置一些属性。

我的问题是:为什么我还需要定义原始的 init 方法?万一新的 init 方法不起作用?

这是我的.h 文件:

#import <Foundation/Foundation.h>

#import "XYPoint.h"

@interface Rectangle: NSObject

@property float width, height, tx, ty;

-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) translate: (XYPoint *) point;
-(id) initWithWidth:(int) w andHeight:(int) h;
-(id) init;

@end

.m(只有初始化方法):

-(id) initWithWidth:(int)w andHeight:(int)h
{
self = [super init];

if (self)
{
[self setWidth:w andHeight:h];
}

return self;
}

-(id) init
{
return [self initWithWidth:0 andHeight:0];
}

我知道这样很好,但如果有人能解释我为什么这样做,我将不胜感激。

最佳答案

这个想法是为您的对象设置一个中心初始化点,而不是在每个 init 方法中散布变量的初始化。

您的特定示例并没有很好地说明这种模式,因为您正在初始化一个宽度为 0 高度为 0 的 Rectangle,并且默认的 NSObject 实现默认将所有实例变量的内存重置为零,并且您的 initWithWidth:andHeight: 方法做同样的事情。但是,假设您在使用创建 Rectangle 对象时默认分配单元矩形(宽度 1,高度 1),

[[Rectangle alloc] init]

然后不这样做,

- (id)initWithWidth:(int)width andHeight:(int)height {
self = [super init];
if (self) {
[self setWidth:width andHeight:height];
}
return self;
}

- (id)init {
self = [super init];
if (self) {
[self setWidth:1 andHeight:1];
}
return self.
}

你只是通过这样做来集中初始化点,

- (id)initWithWidth:(int)width andHeight:(int)height {
self = [super init];
if (self) {
[self setWidth:w andHeight:h];
}
return self;
}

- (id)init {
return [self initWithWidth:1 andHeight:1];
}

这也与DRY的原则密切相关。 a.k.a. 不要重复自己。

这是一个微不足道的例子,但是,在大多数真实世界的对象中,您可能有一个更复杂的设置,包括通知注册、KVO 注册等,然后集中所有初始化逻辑就变得绝对至关重要。

关于objective-c - 覆盖 `init` 方法时,为什么重新定义它很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14930189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com