Делегат (что означает представитель) - это класс (объект), который также хочет представлять (наследовать от) другой несвязанный класс. Объект делегата может наследовать от другого несвязанного класса, «согласовывая» (имея некоторые реализации для) требуемых методов протокола несвязанного класса, которые указывают внешнему классу, что этот объект теперь способен передавать свою самую основную информацию соответствующим образом.
Вы используете наследование, когда хотите, чтобы связанные классы совместно использовали методы. Вы используете делегаты, когда хотите, чтобы несвязанные классы совместно использовали методы. Подход делегата позволяет объекту из одного класса наследовать методы из другого несвязанного класса. «Объект-делегат» или «объект-представитель» - это объект, наследуемый от внешнего класса; он обозначен как представитель, делегат этого удаленного класса, поэтому, когда вы назначаете объект в качестве делегата классу, вы даете ему разрешение также представлять этот класс, даже если он обычно не наследуется от этого класса . (Если он унаследован от класса, вам не нужно устанавливать его в качестве делегата этого класса; у него уже будет доступ к методам класса. Но вы хотите, чтобы этот несвязанный объект наследовал некоторые методы из класса, представляющие этот и возвращая некоторую информацию обратно своему классу-отправителю, поэтому вы делаете его представителем-делегатом этого класса, даже если он наследуется от другого набора классов.) Это, по сути, позволяет одному несвязанному классу наследовать от другого несвязанного класса, но с минимум осложнений по своей основной наследственной линии.
Вы используете систему делегатов, когда хотите, чтобы объект выполнял код из отдельного класса. Например, как описано здесь, когда вы нажимаете Enter в текстовом поле, текстовое поле действительно не знает, что делать. делать с этой информацией. Что он делает, так это смотрит на класс своего объекта-делегата (например, оконный контроллер документа или документ) и использует соответствующий метод этого класса, который соответствует соответствующему методу текстового поля, найденному в его протоколе делегата текстового поля, что-то вроде textFieldShouldReturn. Итак, в этом случае вы устанавливаете контроллер окна или документ в качестве делегата текстового поля, потому что текстовому полю нужен этот класс для представления информации, которую ему было дано.
Классу A нужен метод из класса B, но класс A не наследуется от класса B. Сначала сообщите компилятору, что класс A соответствует протоколу класса B:
@interface ClassA : NSObject <ClassBDelegateProtocol>
В документации Apple каждая ссылка на класс отображается вверху: «Наследуется от» и «Соответствует». Например, NSDocumentController наследуется от NSObject и соответствует NSUserInterfaceValidations, NSCoding и NSObject(NSObject). Соответствие NSCoding взято из объявления интерфейса в NSDocumentController.h
@interface NSDocumentController : NSObject <NSCoding>
и NSUserInterfaceValidations из объявления метода в NSDocumentController.h
-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item;
вместе с #import
#import <AppKit/NSUserInterfaceValidation.h>
Итак, в то время как NSDocumentController наследуется от NSObject, ему нужна помощь также от NSCoding и NSUserInterfaceValidation. И он получает помощь от этих внешних классов, соответствуя их методам протокола, определяя себя как соответствующее этим методам и импортируя все необходимые файлы заголовков для использования этих методов. .
person
Sparky
schedule
04.10.2013