Как заставить компилятор выбрать нужный метод из набора класса методов с одинаковыми именами?
/* Use +[MyClass port](UInt16 (*)(id, SEL),
* not +[NSPort port](NSPort *(*)(id, SEL)). */
UInt16 port = [[self class] port];
У меня есть класс Objective-C с классомМетод:
+ (UInt16)port;
NSPort
имеет удобный конструктор, сигнатура которого конфликтует с этим:
+ (NSPort *)port;
Отправка +port
в мой класс приводит к предупреждению компилятора:
UInt16 port = [[self class] port];
W: Multiple methods named '+port' found
W: Using '+(NSPort *)port'
W: Also found '+(UInt16)port'
Fail: компилятор выбрал неверную сигнатуру метода.
Ошибка вывода типа: использование [[(MyClass *)self class] port]
не приводит к использованию правильного метода.
ETA: Вот обходной путь, который я сейчас использую:
#import <objc/runtime.h>
Class c = [self class];
SEL s = @selector(port);
typedef UInt16 (*PortIMP)(id, SEL);
PortIMP MyClassGetPort = (PortIMP)class_getMethodImplementation(c, s);
UInt16 port = MyClassGetPort(c, s);
Хорошо, что:
- Он обрабатывает диспетчеризацию для любого подкласса.реализация правильно.
- Он ограничен файлом реализации, так что это уродство не причиняется никому, кроме разработчика.
Плохо, что больше никому не поможеткто хочет вызвать метод.