1

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

Я пытаюсь воспроизвести что-то, что существует в PHP: Поздняя статическая привязка. В 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 всегда возвращал объект i n, в котором он находится (всегда родительский). Я также хочу, чтобы это был метод экземпляра. Как мне это сделать?

-Sean

+2

Я не уверен, что это даст вам то, что вы ищете, но изменение метода 'whoAmI' для возврата [Parent class];' приведет к возврату объекта, в котором находится этот метод. – kubi

+0

Это именно то, что я ищу! Я не знал ключевое слово Parent. Спасибо тебе, куби. Не могли бы вы разместить это как ответ, чтобы я мог пометить его как принятый ответ? – Sean

+1

Шон, я думаю, вы неправильно поняли комментарий куби. Нет ключевого слова Parent, я думаю, что он имел в виду ваш класс «ParentClass». Более общий способ добиться того, что говорит куби, - использовать [класс суперкласса]. – Echelon

ответ

2

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

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

+0

Эта документация Runtime от Apple предлагает мне ТОЧНЫЙ контроль, который я ищу. Еще раз, спасибо Эшелону. – Sean

0

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

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

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

Смежные вопросы