Метод считывания Objective C / метод set

Я пытаюсь проложить себе путь через учебное руководство Objective C. В книге существует этот пример:

@interface
{
 int width;
 int height;
 XYPoint *origin;
}
@property int width, height;

Я думал, "эй нет никакого метода считывания/метода set для объекта XYPoint. Код действительно работает все же." Теперь я собираюсь, возможно, ответить на свой собственный вопрос :).

Я думаю, потому что "источник" уже является указателем, и что происходит под капотом с "шириной" и "высотой", то, что там идет te быть созданным указатель на них..

Действительно ли я прав, или я говорю БАКАЛАВР НАУК :)??

Я просто не получаю его. здесь является основным:

#import "Rectangle.h"
#import "XYPoint.h"
int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Rectangle *myRect = [[Rectangle alloc] init];
    XYPoint *myPoint = [[XYPoint alloc] init];

    [myPoint setX: 100 andY: 200];
    [myRect setWidth: 5 andHeight: 8];

    myRect.origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i",
           myRect.width, myRect.height); 

    NSLog (@"Origin at (%i, %i)",
           myRect.origin.x, myRect.origin.y);

    NSLog (@"Area = %i, Perimeter = %i",
           [myRect area], [myRect perimeter]);

    [myRect release];
    [myPoint release];
    [pool drain];

    return 0;
}

И вот Прямоугольный объект:

#import "Rectangle.h"
#import "XYPoint.h"

@implementation Rectangle
@synthesize width, height;

-(void) setWidth: (int) w andHeight: (int) h
{
    width = w;
    height = h;
}

- (void) setOrigin: (XYPoint *) pt
{
    origin = pt;
}
-(int) area
{
    return width * height;
}
-(int) perimeter
{
    return (width + height) * 2;
}
-(XYPoint *) origin
{
    return origin;
}
@end

То, что я не понимаю, является этой строкой в основном: myRect.origin = myPoint; Я не сделал метод set для него..

BTW благодарит за Ваш быстрый ответ

10
задан Muad'Dib 1 November 2011 в 15:28
поделиться

4 ответа

Что я не понимаю, так это эту строку в main: myRect.origin = myPoint; Я не сделал для нее сеттер...

Для origin в классе Rectangle созданы и getter, и setter (совместно называемые accessors) для origin. Если вы посмотрите на реализацию для Rectangle, то это getter:

-(XYPoint *) origin
{
    return origin;
}

и это setter:

- (void) setOrigin: (XYPoint *) pt
{
    origin = pt;
}

И по состоянию на Objective-C 2. 0 вызов:

myRect.origin = myPoint;

эквивалентен:

[myRect setOrigin:myPoint];

Объявление геттеров и сеттеров с помощью @property (а затем их реализация с помощью @synthesize) является лишь одним из способов объявления и создания аксессоров, и существует для удобства, если у вас много свойств, которые нужно объявить в интерфейсе класса. Как сказал Schildmeijer, @property int width эквивалентно объявлению двух методов:

- (int)width;
- (void)setWidth:(int)newWidth;

Из-за динамически связанной природы вызовов методов Objective-C, вы даже не обязаны объявлять методы getter и setter в интерфейсе, хотя это, как правило, лучшая практика, если вы объявляете их общедоступными для других классов.

23
ответ дан 3 December 2019 в 15:05
поделиться

Геттеры и сеттеры в основном полезны, если вам нужно получить доступ к переменной экземпляра из другого класса или вы используете привязки для их получения / установки. Итак, я предполагаю, что вам понадобится эта функция для ширины и высоты, но не для начала координат. Обратите внимание, что геттеры / сеттеры не делают указатели из целых чисел, как вы указали, может быть причиной. Ints - это целые числа, а геттеры / сеттеры этого не меняют.

0
ответ дан 3 December 2019 в 15:05
поделиться

Вы можете рассматривать объявление свойства как эквивалент объявления двух методов доступа. Таким образом,

@property int width;

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

- (int)width;

- (void)setWidth:(int)newWidth;
6
ответ дан 3 December 2019 в 15:05
поделиться

Вы не говорите, какой код работает, или что вы ожидаете от "работы".

Приведенный выше интерфейс создаст простые методы доступа для ширины и высоты, которые можно вызывать из других объектов как [object setWidth: 1]; или object.width = 1; - эти два аналогичны.

Происхождение - это какой-то другой тип объекта и это указатель, да. Но вы все равно захотите объявить свойство для создания методов доступа.

0
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: