Вопрос

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

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

-Савна

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top