Установка вложенных объектов? - PullRequest
0 голосов
/ 10 ноября 2009

Я просто пытаюсь убедиться, что я все делаю правильно, когда я продвигаюсь вперед с Objective-C, два быстрых вопроса, если можно:

(1) Правильно ли я получаю доступ к объекту Position из прямоугольника? я прав, чтобы получить доступ к объекту Position, содержащемуся в указателе, который я установил в init, или есть лучший способ?

(2) В [setPosX: andPosY:] Какой из двух способов установки переменных экземпляра Position является лучшим, или это действительно не имеет значения?

// INTERFACE
@interface Position: NSObject {
    int posX;
    int posY;
}
@property(assign) int posX;
@property(assign) int posY;
@end

@interface Rectangle : NSObject {
    Position *coord;
}
-(void) setPosX:(int) inPosX andPosY:(int) inPosY;

// IMPLEMENTATION
@implementation Rectangle
-(id) init {
    self = [super init];
    if (self) {
        NSLog(@"_init: %@", self);
        coord = [[Position alloc] init];
        // Released in dealloc (not shown)
    }
    return(self);
}
-(void) setPosX:(int) inPosX andPosY:(int) inPosY {
    //[coord setPosX:inPosX];
    //[coord setPosY:inPosY];
    coord.posX = inPosX;
    coord.posY = inPosY;
}

EDIT_01

Затем я вызываю - (id) initWithX: andY: из объекта Rectangle, когда я его инициирую? и если да, то как мне установить posX и posY из main ()? или я заменяю init для прямоугольника на следующий - (id) initWithX: andY: и передаю значения через?

@implementation Rectangle
-(id) init {
    self = [super init];
    if (self) {
        NSLog(@"_init: %@", self);
        coord = [[Position alloc] initWithX:1234 andY:5678];
    }
    return(self);
}
...

Ура Гэри

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

(1) Вы обращаетесь к нему правильно.

(2) В target-c 2.0 назначения имеют одинаковый эффект.

Дизайн мудрый, вы хотели бы сделать:

-(void) setPosX:(int) inPosX andPosY:(int) inPosY;

... в метод позиции. Это инкапсулирует данные и методы, связанные с одним объектом. Таким образом, вы могли бы звонить как:

coord = [[Position alloc] initWithX:inPosX andY:inPosY];

или [координируйте setPosX: inPosX иPosY: inPosY];

все намного чище и проще в обслуживании.


Редактировать O1

Должен ли я тогда позвонить - (id) initWithX: andY: от объекта Rectangle, когда я инициирую это?

Это зависит от вашего дизайна. Если свойство coord абсолютно необходимо для экземпляра Rectangle, то вы должны вызывать его при инициализации экземпляра Rectangle. Вы могли бы даже написать инициализаторы для Rectangle, которые принимают позицию или x и y в качестве ввода. например:

-(id) initWithPosition:(Position *) aPos {
    self = [super init];
    if (self) {
        NSLog(@"_init: %@", self);
        coord = aPos;
        // Released in dealloc (not shown)
    }
    return self;
}

Вы также должны написать инициализатор connivence для класса Position:

-(id) initWithX:(NSInteger) x andY:(NSInteger) y{
     self=[super init];
     self.posX=x;
     self.posY=y;
     return self;
}

Затем вы бы позвонили как:

Position *aPos=[[Position alloc] initWithX:100 andY:50];
Rectangle *aRec=[[Rectangle alloc] initWithPosition:aPos];

Или вы можете написать другой инициализатор комбинации для Rectangle:

-(id) initWithXCoordinate:(NSInteger) x andYCoordinate:(NSInteger) y{
     self=[super init];
     Position *aPos=[[Position alloc] initWithX:x andY:y];
     self.coord=aPos;
     return self;
}

и назовите это как:

Rectangle *aRec=[[Rectangle alloc] initWithXCoordinate:100 
                                        andYCoordinate:50];   

Это грубые примеры, но вы поняли идею. Objective-c дает вам большую гибкость в настройке инициализатора, поэтому вы можете создавать любые инициализаторы, которые вы считаете удобными.

Как правило, вы хотите избежать использования реальных функций вместо методов внутри классов.

1 голос
/ 10 ноября 2009

(1) Вы также должны выпустить его в -dealloc. Действительно ли имеет смысл создавать прямоугольник с неинициализированной позицией? Другими словами, каково поведение [[Position alloc] init], и разумно ли, чтобы прямоугольник когда-либо имел позицию в этом состоянии?

(2) Они оба делают одно и то же. Тот, который вы написали, более понятен, чем тот, который вы прокомментировали, потому что он указывает, что вы меняете свойства, а не заставляете объект что-то делать. Во всяком случае, это мое мнение. Некоторые люди соглашаются, другие - нет, и, как я говорю, поведение такое же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...