Целью-с поздний статический связывающий
-
04-10-2019 - |
Вопрос
Я преподаю себя объективным - 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
}
Это просто так бывает, что то, что я хотел создать, должен был быть вызван статически связыванием моего классового сообщения в сам родительский класс: родитель.