4

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(init メソッドのみ):

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

この方法が良いことはわかっていますが、誰かが私にその理由を説明できれば幸いです。

4

2 に答える 2

5

アイデアは、各 init メソッド全体に変数の初期化を分散させるのではなく、オブジェクトの初期化の中心点を持つことです。

Rectangle を幅 0、高さ 0 で初期化しているため、特定の例はこのパターンを正当化するものではありません。デフォルトの 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別名 Don't Repeat Yourselfの原則とも密接に関連しています。

これは些細な例ですが、ほとんどの現実世界のオブジェクトでは、通知の登録、KVO の登録などのセットアップがはるかに複雑になる可能性があり、その場合、すべての初期化ロジックを一元化することが非常に重要になります。

于 2013-02-18T06:04:09.887 に答える
2

あなたはする必要はありません。通常、super (self = [super initWithXX]) を呼び出す 1 つのイニシャライザがあり、他のイニシャライザはそのイニシャライザに従います。

上記の特定の例では、 initWithWidth:andHeight がメインの初期化子として機能しているため、良い考えです。デフォルトを呼び出すと、メインの初期化子で実行する必要があるコードが呼び出されます。

ところで: イニシャライザ パラメータでの「and」という単語の使用は、最近の Objective-C の規則では少し古風です。

于 2013-02-18T05:52:03.007 に答える