2013-05-29 31 views
7

ngày hôm qua một đồng nghiệp đã hỏi, tại sao chúng ta không khai báo phương thức init (initWith ...: (...)) trong giao thức để buộc thực hiện các lớp để cung cấp bộ khởi tạo như vậy. Tôi đã khá ngạc nhiên về câu hỏi đó và trong sự hiểu biết của tôi, điều này là vô nghĩa. Nhưng tôi không thể tìm thấy một lý do dứt khoát nhưng việc khai báo một phương thức init trong một giao thức dẫn đến sự linh hoạt hơn cho việc triển khai thực hiện.Mục tiêu c init trong giao thức

Bạn có thể cho tôi biết lý do chính đáng hay không, tại sao có hoặc không nên là phương pháp init trong giao thức?

Cảm ơn!

Trả lời

6

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ó.

+0

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

+0

@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

+0

Được rồi, tại sao Giao thức NSCoding lại có phương thức initWithCoder:? – SeriousBob

3

Tôi biết một số giao thức trong SDK iOS có phương thức init .... Ví dụ, NSCoding Protocol có - initWithCoder: phương thức cần thiết. Tôi nghĩ đó là thực hành bình thường.

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