Поздняя статическая привязка Objective-C

Я учу себя Objective-C как досадное удовольствие, если хотите. Я самопровозглашен и хорошо разбираюсь в языке Java, так что это не ужасно трудный переход, хотя и увлекательный. Но увы, у меня вопрос!

Я пытаюсь воспроизвести то, что существует в PHP: Late Static Binding. В PHP я могу украсить вызов метода с помощью «static ::», который динамически привяжет этот метод к вызывающему во время выполнения. С другой стороны, если используется ключевое слово «self ::», привязка является статической и связана с классом, в котором она находится, независимо от того, какой дочерний класс ее вызывает.

В Obj-C мне трудно воспроизвести эту парадигму. Я спросил своего повелителя, Google, как выполнить позднюю статическую привязку в Какао, но я не думаю, что это возможно. Это может называться как-то иначе, или может потребоваться очень надуманный обходной путь. Вот что я сейчас делаю:

Метод родительского класса:

-(id) whoAmI {
 return ([self class]);
}

Дочерний класс ChildClass расширяет ParentClass и не переопределяет метод экземпляра whoAmI.

NSLog(@"Calling from PARENT: %@", [parent whoAmI]);
NSLog(@"Calling from CHILD: %@", [child whoAmI]);

Когда я отправляю сообщение каждому из объектов класса, динамическое связывание выполняет то, что должно делать, и я получаю от NSLog () следующее:

2010-09-21 11: 39: 07.484 WhoAmI [4803: a0f] Вызов от РОДИТЕЛЯ: Родитель
2010-09-21 11: 39: 07.486 WhoAmI [4803: a0f] Вызов от РЕБЕНКА: Ребенок

В конечном счете, я хочу узнать - если возможно - как заставить Cocoa прекратить динамическое связывание, чтобы метод whoAmI всегда возвращал объект, в котором он находится (всегда Parent). Я также хочу, чтобы это был метод экземпляра. Как бы я это сделал?

-Шон


person Sean    schedule 21.09.2010    source источник
comment
Я не уверен, что это даст вам то, что вы ищете, но изменение вашего метода whoAmI на return [Parent class]; всегда приведет к возврату объекта, в котором находится этот метод.   -  person kubi    schedule 21.09.2010
comment
Это именно то, что я ищу! Я не знал ключевого слова Parent. Большое спасибо, Куби. Не могли бы вы опубликовать это как ответ, чтобы я мог отметить его как принятый?   -  person Sean    schedule 21.09.2010
comment
Шон, я думаю, ты неправильно понял комментарий Куби. Нет ключевого слова Parent, я думаю, он имел в виду ваш класс «ParentClass». Более общий способ добиться того, о чем говорит куби, - использовать [суперкласс класса].   -  person Echelon    schedule 21.09.2010
comment
Эшелон, я понимаю, о чем вы. Я знал, что у меня возникнут проблемы из-за того, что я так назвал эти классы. Спасибо тебе за пояснение. Это, наряду с ответом Куби, помогло мне достичь моей цели.   -  person Sean    schedule 21.09.2010


Ответы (2)


На самом деле Objective C имеет мощный набор функций самоанализа, и почти наверняка можно делать то, что вы хотите, обратившись к обширному Документация по Objective C Runtime. Это полный C API для доступа к внутренней работе иерархии объектов и классов Objective C.

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

person Echelon    schedule 21.09.2010
comment
Эта документация среды выполнения от Apple предлагает мне ТОЧНЫЙ элемент управления, который я ищу. Еще раз спасибо Echelon. - person Sean; 22.09.2010

Измените метод, чтобы включить имя родительского класса (или суперкласса):

-(id) whoAmI {
 return ([Parent class]);    //In this instance, Parent is the superclass
}

Так уж получилось, что то, что я хотел создать, должно было быть осуществлено путем статической привязки сообщения моего класса к самому родительскому классу: Parent.

person Sean    schedule 21.09.2010