Я новичок в Objective-C, но имею опыт работы с Java. Есть ли в Java эквивалентная концепция «делегирования» Objective-C, чтобы я мог лучше понять это понятие? Будет ли способ имитировать концепцию делегирования в Java?




Делегирование - это объектно-ориентированный шаблон проектирования. Пример на Java есть в Википедии: Шаблон делегирования
Это не первый класс. Это просто обычный шаблон проектирования в Какао. В этом нет ничего особенного.
Это проще сделать в Objective C, так как легче определить, есть ли у произвольного объекта метод, который вы хотите вызвать (вместо метода, который на самом деле называется «селектором»), который позволяет легко использовать дополнительные методы содержащимся в нем объектом ( завернутые объекты обычно называют «делегатами»).
Делегирование - это просто способ избежать создания подкласса объекта, такого как табличное представление, для реализации конкретного поведения приложения, и вместо этого возложить эту ответственность на контроллер. Когда вы создаете табличное представление, вы назначаете ему объект контроллера, который реализует определенный набор методов (некоторые могут потребоваться, другие могут быть необязательными). Когда табличному представлению требуются данные или необходимо принять решение о том, как отображать себя, оно спрашивает делегата, реализует ли он соответствующий метод, и вызывает его, если это необходимо, для принятия решения.
Спасибо. В вашем примере вы предоставляете делегата для контроллера. Этот делегат является оболочкой для контроллера, с которым будет взаимодействовать табличное представление. Верный? В Java делегат должен реализовывать тот же интерфейс, что и обычный контроллер. Есть ли это понятие в Objective-C?
Я бы сказал, не совсем так, он не оборачивает контроллер, это было бы больше похоже на подкласс. Делегат отвечает на вопросы о том, чем отличается одно использование объекта tableViewController от другого, то есть tableViewController не всегда будет иметь одинаковое количество ячеек, поэтому у делегата будет требуемый метод -numberOfCells, который будет вызывать контроллер чтобы определить, сколько ячеек было, у него будет что-то вроде -cellAtIndex: (int) index, чтобы запросить делегата для каждой из ячеек. Хитрость здесь в том, что табличное представление не имеет подклассов.
java.lang.reflect.Proxy - ближайший эквивалент в java. Хотя использовать это утомительно.
java.lang.reflect.Proxy предназначен для создания прокси / оболочек / делегатов Java в время выполнения. Верно ли это для делегатов Objective-C? Это среда выполнения, а не концепция времени компиляции?
Вот способ думать о делегате - в типичном примере ООП у меня есть объект car. Я не хочу когда-либо снова создавать подклассы, я просто хочу использовать его как есть, так как мне заставить его вести себя как шеви или мустанг? Я даю это делегату.
У моей машины будут способы вождения, способы гудка и т. д.
У моего делегата будут такие методы, как "какая у меня максимальная скорость", "как звучит гудок" и "тонированы ли мои окна".
Поэтому, когда я вызываю -drive на моем объекте автомобиля (который не является подклассом), этот метод вызывает метод моего делегата topSpeed, и делегат сообщает ему 120 миль в час, поэтому машина знает, с какой скоростью она должна ехать, не будучи мустангом.
в Objective C обычно есть протокол, который определяет, на что должен отвечать делегат, то есть для делегата моего объекта автомобиля будет протокол, объявленный следующим образом:
@protocol carDelegate
-(int)carTopSpeed;
-(UIColor*)carColor;
-(BodyShape*)carBodyShape;
-(DragCoefficient*)carDragCoefficient;
-(HoodOrnament*)carHoodOrnament
@optional
-(BOOL)windowsTinted;
@end
Затем вы можете создать свой собственный объект, который соответствует этому протоколу (реализует все необходимые методы и любые дополнительные, которые считаются необходимыми).
И объект car будет ожидать, что (id) будет передан ему как делегат.
Тогда объекту car удалось избежать разделения на подклассы, и он по-прежнему может вести себя в соответствии с потребностями пользователя.
Почему -drive вызывает -topSpeed? Я не вижу связи
Предположим, что объект Car немного похож на актера, а carDelegate немного похож на директора. Вместо того, чтобы создавать подклассы актера, мы просто заставляем актера спрашивать режиссера, как ему действовать, а вы создаете собственных режиссеров. Поэтому, когда вы просите машину поехать, она спрашивает делегата, с какой скоростью она должна ехать.
Спасибо за ссылку. Неужели это так просто, как обернуть один объект другим - и раскрыть те же методы, но с (немного) другим поведением? Мое (очень ограниченное) понимание делегирования состоит в том, что это в большей степени первоклассная концепция в Objective-C.