Bạn xác định các phương thức trong giao thức để mã của bạn có thể gọi các phương thức do người khác triển khai. Các "hợp đồng" giữa bạn và nhà phát triển thực hiện Nghị định thư của bạn trông như thế này:
- Bạn xác định giao thức,
- Một người nào khác thực hiện Nghị định thư của bạn,
- Một người nào khác tạo ra một đối tượng thực hiện giao thức của bạn và cung cấp cho bạn, vì vậy,
- Bạn có thể gọi các phương thức giao thức của bạn mà không biết triển khai.
Để gọi các phương thức của giao thức, bạn cần có một cá thể của đối tượng đang triển khai giao thức. Toàn bộ các giao thức định nghĩa được loại bỏ khỏi mã của bạn bất kỳ kiến thức nào về lớp thực hiện giao thức của bạn: nếu bạn biết lớp nào bạn sẽ nhận được, bạn cũng có thể bỏ qua giao thức và chương trình trực tiếp đến lớp. Tuy nhiên, nếu bạn muốn gọi số init
, bạn phải biết lớp học hoặc người khác phải chuyển cho bạn một đối tượng alloc
mà trên đó init
chưa được gọi. Không có lựa chọn thay thế nào là ý tưởng hay - đầu tiên giết chết mục đích của việc có các giao thức và lực thứ hai mà người gọi của bạn đối phó trong các đối tượng được khởi tạo một phần.
Lưu ý rằng nó không ngăn cản bạn từ việc phi init
phương pháp cấu hình trong một giao thức: nếu tất cả các đối tượng phải được cấu hình sử dụng bit thông tin nhất định, cho phép người dùng của bạn thực hiện bất cứ điều gì init
mà họ muốn, và thêm một phương pháp để configureWith:...
giao thức của bạn, cho phép bạn kiểm soát quá trình định cấu hình đối tượng mà không biết về phương thức init
của nó.
Có thể nào, đây là thực hành bình thường, nếu không ** Người khác ** tạo đối tượng đang triển khai giao diện, nhưng ** Bạn **? – SeriousBob
@SeriousBob Nếu bạn tạo đối tượng, sau đó bạn biết loại của nó, cùng với tất cả các giao thức mà nó thực hiện. Trong trường hợp này, biết rằng 'init' (hoặc cho rằng vấn đề, bất kỳ phương pháp khác) là một phần của một giao thức không còn cần thiết. – dasblinkenlight
Được rồi, tại sao Giao thức NSCoding lại có phương thức initWithCoder:? – SeriousBob