Objective-C Позднее статическое связывание - PullRequest
1 голос
/ 21 сентября 2010

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

Я пытаюсь воспроизвести что-то, что существует в 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] Звонок от РЕБЕНКА: Детский

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

-Sean

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

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

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

0 голосов
/ 21 сентября 2010

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

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

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

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