2011-09-21 29 views
8

Đọc qua tài liệu hướng dẫn của Apple trên Tips and Techniques for Framework Developers, tôi đi qua tuyên bố này về initializers định:Khi nào một lớp học sẽ có nhiều hơn một trình khởi tạo được chỉ định?

Một initializer định là một phương pháp init của một lớp mà gọi một phương pháp init của lớp cha. (Trình khởi tạo khác gọi các phương thức init do lớp xác định.) Mọi lớp công khai phải có một hoặc thêm trình khởi tạo được chỉ định.

(Nhấn mạnh thêm.)

Dựa trên sự hiểu biết và tôi thực sự, việc sử dụng rất của từ "thiết kế" -một lớp nên chỉ có một initializer được chỉ định. Nhưng theo tài liệu, nhiều người khởi tạo được chỉ định có thể chấp nhận được.

Giả sử bạn có hai (hoặc nhiều) trình khởi tạo được chỉ định, vai trò của chúng là gọi trình khởi tạo được chỉ định của lớp cha để đảm bảo khởi tạo đối tượng thích hợp. Nhưng nếu cả hai initializers được chỉ định đang gọi cùng một superclass được chỉ định initializer, thì tại sao có nhu cầu cho nhiều hơn một trong những nơi đầu tiên? Không nên lớp được cấu trúc lại để kênh tất cả các phương thức init khác cho trình khởi tạo được chỉ định số ít?

Tôi hơi bối rối về trường hợp sử dụng hoặc mẫu thiết kế nào sẽ gọi cho nhiều trình khởi tạo được chỉ định?

+1

Đôi khi các thông số cho mỗi bộ khởi tạo quá khác nhau để kênh vào cùng bộ khởi tạo "được chỉ định". Các khuyến nghị là bạn có initializers với các tham số ít nhất gọi một initializer duy nhất với hầu hết các thông số, nhưng điều đó không phải luôn luôn có ý nghĩa. – spstanley

+0

Ngay cả trong trường hợp lớp của bạn có thể có khởi tạo với các tham số khác nhau rộng rãi, không chỉ một trình khởi tạo chịu trách nhiệm gọi trình khởi tạo được chỉ định của lớp cha? Không nên người khác điều chỉnh các thông số của nó và do đó gọi initializer được chỉ định trong nội bộ? – LucasTizma

Trả lời

6

Bạn sẽ làm điều này khi bạn muốn khởi tạo khác nhau cho các đối tượng khác nhau của cùng một lớp. Một ví dụ là các nhóm lớp, như NSNumber. Nó có khá nhiều khởi tạo cho các kiểu số khác nhau mà chúng có thể giữ. Để cung cấp biểu diễn chính xác nhất, lớp phải giữ giá trị của nó theo cùng định dạng mà nó nhận được, thay vì truyền. Điều này có nghĩa là initializers không thể chỉ đơn giản gọi một initializer chung và return. Họ cần phải làm một số công việc tùy chỉnh. Điều này làm cho chúng khởi tạo được chỉ định.

Ví dụ khác sẽ là lớp tài liệu chỉ cần khởi tạo một số tệp mới và một số lần khởi tạo khác chỉ dành cho tài liệu đang được mở. Cả hai bộ khởi tạo này sẽ gọi triển khai siêu của chúng, do đó gọi phương thức init đơn giản để thực hiện khởi tạo chung. Tuy nhiên, vì họ làm nhiều hơn là chỉ đơn giản gọi một trình khởi tạo khác với một giá trị mặc định, chúng được coi là khởi tạo được chỉ định.

+0

Cảm ơn bạn đã làm rõ. – LucasTizma

+4

Một ví dụ tốt là 'UIView''s' initWithFrame: 'và' initWithCoder: '. Nếu bạn lập trình nó ngay lập tức, bạn muốn trước đây. Nếu bạn đang tải từ kho lưu trữ, sau này. Các lớp con sẽ gọi một trong những (hoặc tương đương = một cái gì đó sẽ gọi một trong số đó) trong các tình huống thích hợp. – bshirley

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