Делегат (что означает представитель) является объектом класса ('s), который хочет также представлять (наследовать) другой несвязанный класс.Объект делегирования может наследовать от иначе несвязанного класса путем «соответствия» (с некоторыми реализациями) методов протокола не связанных между собой классов, которые указывают иностранному классу, что этот объект теперь способен правильно управлять своей самой базовой информацией.
Вы используете наследование, если вы хотите классы для обмена методами. Вы используете делегатов, если вы хотите не связаны классы для обмена методами. Подход делегата позволяет объекту из одного класса наследовать методы из иначе несвязанного класса. «Объект делегирования» или «представительский объект» - это объект, который наследуется от иностранного класса; он назначается представителем, делегатом этого удаленного класса, поэтому, когда вы назначаете объект в качестве делегата для класса, вы даете ему разрешение также представлять этот класс, даже если он обычно не наследуется от этого класса , (Если он унаследован от класса, тогда вам не нужно будет устанавливать его как делегат этого класса, он уже будет иметь доступ к методам класса. Но вы хотите, чтобы этот несвязанный объект наследовал некоторые методы из класса, представляя это class и возвращать некоторую информацию обратно в класс отправителя, поэтому вы делаете его представителем делегата этого класса, даже если он наследуется от другого набора классов.) Это по существу позволяет одному неродственному классу наследовать от другого несвязанного класса, но с минимум осложнений по отношению к основной линии наследования.
Вы используете систему делегатов, если хотите, чтобы объект выполнял код из отдельного класса. Например, as described here, когда вы нажимаете Enter в текстовом поле, текстовое поле действительно не знает, что делать с этой информацией. То, что он делает, выглядит как класс его делегата (например, оконный контроллер документа или документ) и использует соответствующий метод этого класса, который соответствует соответствующему методу текстового поля, найденному в его протоколе делегирования текстового поля, что-то вроде textFieldShouldReturn. Таким образом, в этом случае вы устанавливаете оконный контроллер или документ в качестве делегата текстового поля, потому что текстовое поле нуждается в этом классе для представления информации, которую он предоставил.
класса А необходим метод из класса B, но класса А не наследует от класса B. Во-первых, сказать компилятору, что класс А соответствует протоколу класса B:
@interface ClassA : NSObject <ClassBDelegateProtocol>
В документации компании Apple, каждая ссылка класса отображается вверху, «Inherits from» и «Conforms to». Например, 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
. И он получает помощь от этих иностранных классов по в соответствии с их протокольными методами, , определяя себя в соответствии с этими методами и , импортируя необходимые файлы заголовков для использования этих методов.
Мне было трудно с этим, когда я начинал смотреть на Какао. Ты не одинок. – jergason