2009-07-09 36 views
10

Tôi đang học Objective-C tại thời điểm này và đã bắt gặp các phương thức tùy chọn trong Giao thức. Nền của tôi là C# và có thể thấy Giao thức giống như Giao thức C#.Ví dụ thế giới thực của các phương thức giao thức @optional

Trường hợp giao diện C# biểu thị hợp đồng, bằng cách quảng cáo Giao diện bạn đang nói rằng bạn sẽ triển khai các phương thức được xác định.

Với điều này trong tâm trí tôi là nhầm lẫn lý do tại sao bạn sẽ cần phải xác định một phương pháp tùy chọn. Đây không phải là slur hoặc một nỗ lực để giảm Objective-C, tôi yêu Objective-C. Tôi chỉ muốn hiểu những lợi ích của các phương pháp tùy chọn này, để hiểu rõ hơn về ngôn ngữ.

Tôi thực sự đánh giá cao nếu ai đó có thể cung cấp một số tình huống thực tế (với mã mẫu) trong đó các phương pháp tùy chọn hữu ích.

Trả lời

14

Tôi sẽ cung cấp cho bạn một ví dụ. Tôi có một số lớp học ObjC nói chuyện với API Flickr. Một, được gọi là FKAccount có thể thực hiện nhiều việc liên quan đến tài khoản của người dùng Flickr bao gồm tải xuống ảnh của người dùng, nhận danh sách liên hệ của họ và v.v.

Lớp FKAccount xác định giao thức đại biểu FKAccountDelegate. Giao thức này chỉ định một số phương thức gọi lại mà FKAccount sẽ gọi trên đại biểu của nó tùy thuộc vào sự thành công hay thất bại của các hoạt động mạng khác nhau đối với Flickr. Không phải mọi ứng dụng sử dụng FKAccount sẽ quan tâm đến mọi hoạt động Flickr mà FKAccount có thể hoạt động.

Nếu yêu cầu mọi lớp tuyên bố thực hiện giao thức FKAccountDelegate đã triển khai mọi phương pháp, bạn sẽ kết thúc với nhiều phương pháp sơ khai (FWIW, có 41 phương thức được xác định trong FKAccountDelegate). Khi các phương thức này được khai báo là @optional trong giao thức, đại biểu chỉ cần thực hiện cuộc gọi lại mà nó quan tâm đến việc nhận.

Các FKAccount kiểm tra lớp học mà đại biểu của nó đáp ứng @optional phương pháp trong giao thức bởi:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

Tôi nghĩ rằng tôi nhận được nó ngay bây giờ. Giao diện C# chỉ là một khía cạnh của Giao thức mục tiêu-C. Bạn có thể sử dụng Giao thức dưới dạng hợp đồng, nhưng các phương thức tùy chọn này cấu thành danh sách các đại biểu tùy chọn mà đối tượng cũng có thể chọn trả lời. Điều đó thực sự thú vị. – kim3er

+1

+1 để sử dụng giao thức để ghi lại chức năng ủy nhiệm –

+1

Tôi hoàn toàn đồng ý với @Tom. Trước Objective-C 2.0, các phương thức ủy nhiệm thường được khai báo trong một danh mục trên NSObject để tránh bất kỳ lớp nào muốn trở thành một đại biểu phải thực hiện tất cả các phương thức. Các phương thức tùy chọn trong các giao thức là một giải pháp sạch hơn, không tấn công các phương thức lên NSObject, và giúp tránh xung đột phương pháp. Nếu chỉ có Java có các phương thức giao diện tùy chọn, sẽ không cần thiết cho những thứ như kế thừa từ MouseAdapter. Sử dụng các lớp như thế thường là vài lần mà tôi đã nguyền rủa thừa kế duy nhất ... :-) –

Các vấn đề liên quan