Какой правильный термин для родителей? - PullRequest
5 голосов
/ 02 апреля 2009

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

parent.moveForward

Однако в Obj-C родительский элемент относится к суперклассу (не уверен, почему у него супер и родительский означает одно и то же).

Я не могу найти эквивалента для родителя стиля Action-script, но тогда я не знаю, что вообще искать. Есть ли простой способ сделать это в Obj-C, или мне нужно вручную передать ссылку на экземпляр при его создании? Я пробовал это, и это выдает ошибку, но так как я новичок в Obj-C, я просто хотел убедиться, что я поступаю правильно.

Ответы [ 6 ]

6 голосов
/ 03 апреля 2009

Интересно ... Я не знал, что Actionscript использовал слово «родитель» таким образом.

Здесь работают две отдельные концепции: наследование и композиция. Термин parent используется в обоих случаях в Objective-C и во многих других объектно-ориентированных языках.

В Objective-C класс, который наследуется от другого, ссылается на этот «другой» класс как своего предка. В то время как многие люди используют термин superclass, на самом деле вы можете вполне законно использовать слово parent. Как видно из названия, это объект "наследования".

Объект «композиция», с другой стороны, это то, что вы описали на примере автомобиля и колеса. Автомобиль состоит из нескольких других объектов, одним или несколькими из которых является колесо. Я должен признать, я не часто слышал термин parent, используемый в этом контексте для обозначения автомобиля. Обычно вы, вероятно, обнаружите, что большинство людей в мире Objective-C узнают car по метке «контейнер». Однако в случае древовидной структуры данных, такой как документ XML, мы часто говорим о родительских узлах и дочерних узлах. Родитель содержит дочерние элементы, поэтому использование слова «родитель» в композиционных отношениях также целесообразно в зависимости от типа отношений. Я не думаю, что вы найдете многих программистов Objective-C, использующих слово «родитель» в сценариях композиции вне древовидной структуры.

Различие часто сравнивают с отношением «имеет» и «является»: идентичность против обладания. В наследовании дочерний объект является «подтипом» своего родителя. В композиции, с другой стороны, автомобиль "имеет" колесо, или родительский узел в дереве "имеет" коллекцию дочерних узлов.

Редактировать: Кендалл Хельмштеттер-Гелнер ниже добавил несколько хороших комментариев по части вашего вопроса, касающейся случаев и передачи ссылок. Если у вас есть определенный блок кода и конкретное сообщение об ошибке, пожалуйста, не стесняйтесь обновить свой вопрос с ними, и мы постараемся помочь.

4 голосов
/ 03 апреля 2009

Чтобы следовать за композиционным ответом - обычным шаблоном было бы, чтобы родитель создавал или получал объекты, за которые держался, а затем устанавливал себя как своего рода делегат для каждого (если им нужно ссылаться на parent) - обратите внимание, что ссылки на делегаты в отличие от большинства других вещей почти никогда не сохраняются, обычно присваиваются.

поэтому в вашем примере родитель скажет каждому колесу:

wheel.carDelegate = self;

тогда колесо может сказать родителю:

[carDelegate moveForward];

Хотя, честно говоря, метафора в примере немного теряет меня!

Другой подход заключается в обновлении переменных в содержащихся объектах, которые родительский объект каким-либо образом опрашивает (этот подход, например, может хорошо работать, создавая представления, которые передаются с помощью контроллера навигации, а затем возвращаются туда, где главное представление должно что-то делать на основе изменения сделаны во вложенных видах).

3 голосов
/ 03 апреля 2009

Поскольку вы говорите о прямой Objective-C, а не о конкретной реализации фреймворка (такого как Какао), существует много способов реализовать поведение родитель-потомок. Самым простым, конечно, является наличие в родительском объекте класса нескольких переменных экземпляра, являющихся дочерними. Все дети принимают методы, такие как initWithParent: или initWithCar: в данном конкретном случае.

@interface Car : Object
{
    Wheel[4] wheels;
}

- (void) goFoward:(Wheel *) wheel;

@end

@interface Wheel : Object
{
    Car *parent;
    float tirePressure;
    // etc . . .
}

- initWithCar:(Car *) aCar;

@end

@implementation Car
- init
{
    self = [super init];
    if (!self) return nil;

    unsigned i;
    for (i = 0; i < 4; i++)
        wheels[i] = [[Wheel alloc] initWithCar:self];

    return self;
}

- (void) goForward:
@end

@implementation Wheel
- initWithCar: (Car *) aCar
{
    self = [super init];
    if (!self) return nil;

    parent = aCar;

    return self;
}
@end
2 голосов
/ 03 апреля 2009

не уверен, почему у них супер и родитель означает одно и то же

Типичная путаница:)

  • Супер - это получатель , а не родитель этого класса. Также как я не класс получателя. Разница между собой и супер - это то, с чего начинается поиск метода.

  • Родитель - это указатель от класса на его суперкласс, за которым следует поиск метода.

1 голос
/ 03 апреля 2009

Наблюдение ключевого значения исследования или КВО . Автомобиль может следить за изменениями в Колесе и обновлять себя.

1 голос
/ 03 апреля 2009

Это не распространено, по крайней мере, явно. В Какао есть две возможности, которые, я думаю, заменили функцию, о которой вы говорите:

  1. Делегирование. Вы даете колесу ссылку на другой объект, который реализует определенный набор методов. Это может быть владелец объекта, но это может быть какой-то другой объект, который находится на месте (отлично подходит для тестирования). Вы можете видеть это через рамки Какао.

  2. Уведомления. В настоящее время это чаще всего делается через Наблюдение значения ключа . При этом объект A (автомобиль в вашем примере) регистрируется для получения уведомлений при изменении определенного свойства объекта B (колесо).

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