Một đại biểu (có nghĩa là đại diện) là một lớp (đối tượng) muốn đại diện cho (kế thừa từ) một lớp không liên quan khác.Đối tượng delegate có thể kế thừa từ một lớp không liên quan bằng cách "tuân thủ" (có một số triển khai) các phương thức giao thức yêu cầu của lớp không liên quan, cho biết lớp ngoài là đối tượng này bây giờ có khả năng khai thác thông tin cơ bản nhất của nó một cách thích hợp.
Bạn sử dụng thừa kế khi bạn muốn liên quan lớp học để chia sẻ phương pháp. Bạn sử dụng đại biểu khi bạn muốn không liên quan các lớp học để chia sẻ phương pháp. Cách tiếp cận ủy nhiệm cho phép một đối tượng từ một lớp kế thừa các phương thức từ một lớp không liên quan khác. "Đối tượng đại diện", hoặc "đối tượng đại diện", là đối tượng kế thừa từ một lớp nước ngoài; nó được chỉ định như là một đại diện, một đại biểu, của lớp từ xa đó, để khi bạn gán một đối tượng làm đại biểu cho một lớp, bạn cũng cho phép nó đại diện cho lớp đó, mặc dù nó không kế thừa từ lớp đó . (Nếu nó được kế thừa từ lớp, thì bạn sẽ không cần phải thiết lập nó như là một đại biểu của lớp đó, nó sẽ có quyền truy cập vào các phương thức của lớp. Nhưng bạn muốn đối tượng không liên quan này kế thừa một số phương thức từ lớp, và trả về một số thông tin về lớp người gửi của nó, vì vậy bạn làm cho nó trở thành đại diện của lớp đó mặc dù nó kế thừa từ một nhóm các lớp khác.) Về cơ bản, nó cho phép một lớp không liên quan kế thừa từ một lớp không liên quan khác. tối thiểu các biến chứng cho dòng thừa kế cơ bản của nó.
Bạn sử dụng hệ thống đại biểu khi bạn muốn một đối tượng thực thi mã từ một lớp riêng biệt. Ví dụ: as described here, khi bạn nhấn Enter trong trường văn bản, trường văn bản thực sự không biết phải làm gì với thông tin đó. Những gì nó làm là nhìn vào lớp của đối tượng delegate (chẳng hạn như bộ điều khiển cửa sổ của tài liệu hoặc tài liệu) và sử dụng phương thức liên quan của lớp đó phù hợp với phương thức tương ứng của trường text được tìm thấy trong giao thức ủy nhiệm trường văn bản của nó, giống như textFieldShouldReturn. Vì vậy, trong trường hợp này, bạn đặt trình điều khiển cửa sổ hoặc tài liệu làm đại biểu của trường văn bản, bởi vì trường văn bản cần lớp đó để biểu diễn thông tin được cung cấp.
Class A cần có một phương pháp từ Class B, nhưng Class A không kế thừa từ lớp B. Đầu tiên, hãy nói với trình biên dịch rằng Class A phù hợp với các giao thức Lớp B:
@interface ClassA : NSObject <ClassBDelegateProtocol>
Trong Documentation Apple, mỗi tham chiếu lớp hiển thị ở trên cùng, "Kế thừa từ" và "Phù hợp với". Ví dụ: NSDocumentController
được kế thừa từ NSObject
và phù hợp với NSUserInterfaceValidations
, NSCoding
và NSObject(NSObject)
. Các sự phù hợp để NSCoding
là từ việc khai báo giao diện trong NSDocumentController.h
@interface NSDocumentController : NSObject <NSCoding>
và NSUserInterfaceValidations
từ khai báo phương thức trong NSDocumentController.h
-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item;
cùng với #import
#import <AppKit/NSUserInterfaceValidation.h>
Vì vậy, trong khi NSDocumentController
được kế thừa từ NSObject
, nó cũng muốn một số trợ giúp từNSCoding
và NSUserInterfaceValidation
. Và nó được giúp đỡ từ các lớp học nước ngoài này bằng cách tuân thủ các phương thức giao thức của chúng, xác định chính nó như tuân theo các phương pháp và nhập bất kỳ tệp tiêu đề cần thiết nào để sử dụng các phương pháp đó.
Tôi đã có một thời gian khó khăn với điều này khi tôi bắt đầu xem xét Cocoa. Bạn không cô đơn. – jergason