Как вызовы методов разрешаются аргументом в классах категорий в Objective C?

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

Скажем, для корневого класса R дочерними классами являются C1 и C2.

Для C1 у меня есть категория DataManager+C1.
Для C2 у меня есть категория DataManager+C2.

У меня есть базовый класс DataManager, в котором я объявил этот метод, откуда он доступен везде, и других объявлений нет:

//DataManager.h
+ (NSDictionary *) Method1 : (DataModelRoot*) R;
//Note that R is my root class. Individual class implementations belong to DataManager+C1.m, DataManager+C2.m etc.

Реализация Method1 находится в DataManager+C1, а также в DataManager+C2.

Но я не вижу полиморфного поведения.

То есть, когда ожидается вызов Методом1 DataManager+C2, вызывается вызов внутри DataManager+C1, хотя сам вызов инициируется из исходного файла DataManager+C2. (вызывающий может быть любой категорией DataManager, хотя это крайний случай).

Как количество категорий объектов, лежащих в одной иерархии классов, разрешает вызовы функций?

PS: Еще раз обратите внимание, что метод Method1, описанный выше, ПРЕДСТАВЛЯЕТСЯ ТОЛЬКО в файле .h одного класса (обычный DataManager.h) с корневым классом в качестве аргумента. Я предполагаю, что это обеспечит правильный вызов с использованием типа дочернего объекта, но это не удается.


person Nirav Bhatt    schedule 14.09.2015    source источник
comment
Как вы вызываете метод класса? Пожалуйста, отправьте код фактического вызова.   -  person Nikolai Ruhe    schedule 14.09.2015


Ответы (1)


Objective-C поддерживает полиморфизм методов класса, когда цель сообщения на самом деле является полиморфной.

Пример:

[DataManager Method1:nil];

... будет не выбирать цель полиморфно, поскольку целью является конкретный класс DataManager. Он всегда будет отправлять сообщение реализации в DataManager.

Если, с другой стороны, цель является динамически определяемой, то, как и ожидалось, имеет место фактический полиморфизм. Типичным примером является реализация метода экземпляра в том же классе или подклассе:

- (void)foo
{
    [[self class] Method1:nil];
}

Это действительно вызвало бы ближайшую переопределенную реализацию Method1: и, таким образом, предоставило бы полиморфное поведение.

Примечание: описанное выше поведение не зависит от категорий. При условии отсутствия конфликтов имен категории мало влияют на способ отправки сообщений.

person Nikolai Ruhe    schedule 14.09.2015
comment
+1 спасибо. Будет ли создание Method1 методом экземпляра DataManager достигать того, чего я хочу? Как добиться полиморфизма по аргументу? У меня есть категории DataManager, определенные для каждого подкласса R, и невозможно получить сам DataManager - по крайней мере, на данном этапе. - person Nirav Bhatt; 14.09.2015
comment
Я не уверен, что вы имеете в виду под полиморфизмом по аргументу. Objective-C обеспечивает полиморфизм, отправляя первый аргумент (цель сообщения). Это не дает вам того, что некоторые языки называют множественной отправкой. Кроме того, у objc нет перегрузки (что совсем другое). - person Nikolai Ruhe; 14.09.2015