Делегат (что означает представитель ) - это класс (объект), который также хочет представлять (наследовать) другой не связанный класс. Объект делегата может наследовать от другого несвязанного класса, «соответствуя» (имея несколько реализаций) требуемым методам протокола несвязанного класса, которые указывают стороннему классу, что этот объект теперь способен соответствующим образом передавать свою основную информацию.
Вы используете наследование , когда хотите, чтобы связанные классы обменивались методами. Вы используете делегатов , когда хотите, чтобы несвязанные классы совместно использовали методы. Подход делегата позволяет объекту от одного класса наследовать методы от иначе несвязанного класса. «Объект делегата» или «представительский объект» - это объект, который наследуется от чужого класса; он обозначается как представитель, делегат этого удаленного класса, поэтому при назначении объекта в качестве делегата классу вы даете ему разрешение также представлять этот класс, даже если он обычно не наследуется от этого класса. , (Если он унаследован от класса, вам не нужно устанавливать его в качестве делегата этого класса; у него уже будет доступ к методам класса. Но вы хотите, чтобы этот несвязанный объект наследовал некоторые методы из класса, представляя класс, и возвращая некоторую информацию обратно в класс отправителя, так что вы делаете его представителем-делегатом этого класса, даже если он наследует от другого набора классов.) Это по существу позволяет одному несвязанному классу наследовать от другого несвязанного класса, но с минимум осложнений к его основной линии наследования.
Вы используете систему делегатов, когда хотите, чтобы объект выполнял код из отдельного класса. Например, , как описано здесь , когда вы нажимаете 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
. И он получает помощь от этих внешних классов, в соответствии с их методами протокола , , определяющими себя как соответствующие этим методам , и , импортирующими любые необходимые заголовочные файлы для использования этих методов .