Đối với các phương pháp Mục tiêu-C, thực hành chung là đặt các phương thức bạn muốn hiển thị trong phần @interface
của tệp tiêu đề để mã khác chỉ có thể bao gồm .h và biết cách tương tác với mã của bạn. Lệnh "lazy declaration" dựa trên lệnh giống như các hàm trong C - bạn không phải khai báo nguyên mẫu phương thức trừ khi bạn có một sự phụ thuộc không thể được giải quyết bằng cách đặt hàng, nhưng bạn có thể thêm các nguyên mẫu phương thức bên trong @implementation
nếu cần thiết.
Vì vậy, có, bạn đang đi đúng hướng. Đừng lặp lại nguyên mẫu phương thức cho các phương thức kế thừa - trình biên dịch tìm thấy nó trong tệp tiêu đề của cha mẹ. Các phương thức ủy quyền có thể được định nghĩa là các nguyên mẫu trong một thể loại (được xếp vào một lớp) và được thực hiện như mong muốn, nhưng đại biểu không cần phải cung cấp một nguyên mẫu phương thức, vì nó đã được định nghĩa. (Nó vẫn có thể nếu nó muốn cho rõ ràng, vv)
Vì bạn đang học Objective-C, phần còn lại của câu trả lời này chi tiết hơn nhiều so với bạn đã yêu cầu. Bạn đa được cảnh bao. ;-)
Khi bạn tĩnh gõ một biến (ví dụ MyClass*
thay vì id
) trình biên dịch sẽ cảnh báo bạn khi bạn cố gắng gọi một phương thức mà một lớp không quảng cáo rằng nó thực hiện, cho dù nó hay không. Nếu bạn tự động gõ biến, trình biên dịch sẽ không ngăn bạn gọi bất cứ điều gì bạn thích, và bạn sẽ chỉ nhận được lỗi thời gian chạy nếu bạn gọi một cái gì đó không tồn tại. Theo như ngôn ngữ có liên quan, bạn có thể gọi bất kỳ phương thức nào mà một lớp thực hiện mà không có lỗi trong thời gian chạy - không có cách nào để hạn chế ai có thể gọi một phương thức.
Cá nhân, tôi nghĩ đây thực sự là một điều tốt. Chúng tôi nhận được như vậy được sử dụng để đóng gói và bảo vệ mã của chúng tôi từ mã khác mà đôi khi chúng tôi đối xử với người gọi như một miscreant devious chứ không phải là một đồng nghiệp đáng tin cậy hoặc khách hàng. Tôi thấy khá dễ chịu khi viết mã với một suy nghĩ về "bạn làm công việc của bạn và tôi làm công việc của tôi", nơi mọi người tôn trọng ranh giới và chăm sóc cho chính họ. Bạn có thể nói rằng "thái độ" của Mục tiêu-C là một trong những niềm tin của cộng đồng, thay vì thực thi nghiêm ngặt. Ví dụ, tôi rất sẵn lòng giúp đỡ bất cứ ai đến bàn làm việc của tôi, nhưng sẽ rất khó chịu nếu ai đó làm rối tung đồ của tôi hoặc di chuyển mọi thứ xung quanh mà không hỏi. Mã được thiết kế tốt không phải là hoang tưởng hoặc sociopathic, nó chỉ cần làm việc tốt với nhau. :-)
Điều đó nói rằng, có nhiều cách tiếp cận để cấu trúc giao diện của bạn, tùy thuộc vào mức độ chi tiết bạn muốn/cần trong việc hiển thị giao diện cho người dùng. Bất kỳ phương pháp nào bạn khai báo trong tiêu đề công khai đều là trò chơi công bằng cho mọi người sử dụng. Ẩn phương pháp khai báo hơi giống như khóa xe hoặc nhà của bạn - nó có thể sẽ không giữ tất cả mọi người, nhưng (1) nó "giữ người trung thực trung thực" bằng cách không hấp dẫn họ với một cái gì đó họ không nên rối tung, và (2) bất cứ ai nào nhận được trong chắc chắn sẽ biết họ không được phép, và không thể thực sự phàn nàn về hậu quả tiêu cực.
Dưới đây là một số quy ước tôi sử dụng để đặt tên tệp và nội dung trong mỗi tệp - bắt đầu từ tệp .m ở dưới cùng, mỗi tệp bao gồm tệp ở trên tệp. (Sử dụng một chuỗi bao gồm nghiêm ngặt sẽ ngăn chặn những thứ như cảnh báo biểu tượng trùng lặp.) Một số các mức này chỉ áp dụng cho các thành phần có thể tái sử dụng lớn hơn, chẳng hạn như khung Cocoa. Điều chỉnh chúng theo nhu cầu của bạn và sử dụng bất kỳ tên nào phù hợp với bạn.
MyClass.h
- API công cộng (Application Programming Interface)
MyClass_Private.h
- Công ty nội bộ SPI (Hệ thống Programming Interface)
MyClass_Internal.h
- Dự án nội bộ IPI (Internal Programming Interface)
MyClass.m
- Thực hiện, nói chung của tất cả các khai báo API/SPI/IPI
MyClass_Foo.m
- Triển khai bổ sung, chẳng hạn như đối với các loại
API dành cho mọi người sử dụng và được hỗ trợ công khai (thường là ở Foo.framework/Headers
). SPI cho thấy chức năng bổ sung cho khách hàng nội bộ của mã của bạn, nhưng với sự hiểu biết rằng hỗ trợ có thể bị giới hạn và giao diện có thể thay đổi (thường là trong Foo.framework/PrivateHeaders
). IPI bao gồm các chi tiết cụ thể về việc triển khai không bao giờ nên được sử dụng bên ngoài dự án và các tiêu đề này không được bao gồm trong khung công tác. Bất kỳ ai chọn sử dụng các cuộc gọi SPI và IPI đều có thể tự chịu rủi ro, và thường gây thiệt hại cho họ khi các thay đổi phá vỡ mã của họ. :-)
+1. Cảm ơn bạn đã nâng cao rằng chúng tôi không nên cần các tấm thép để giữ đồng nghiệp không bị rối tung với các hình khối của chúng tôi và chúng tôi không cần phải thực thi ngôn ngữ để giữ cho chúng không bị rối loạn với cấu trúc dữ liệu nội bộ. Nếu chúng ta cần, chúng ta cần đồng nghiệp tốt hơn. Cảnh báo biên dịch là quan trọng (cùng với -Werror), giống như các nhãn nhỏ trên thực phẩm trong tủ lạnh nói rằng "đây là của tôi, không ăn nó." ObjC là ngôn ngữ dành cho người lớn. Bạn làm theo các quy tắc ngay cả khi mẹ của bạn (trình biên dịch) không ép buộc bạn. Và do đó bạn không cần phải tìm các thủ thuật xung quanh trình biên dịch như bạn thường làm như vậy bằng các ngôn ngữ khác. –
+1 Câu trả lời hay! :) –
Tôi hy vọng tôi không bị thiếu điểm, nhưng tôi thường tự hỏi liệu có thể ẩn các biến thành viên bằng cấu trúc của các lớp của lớp này, hay mọi thứ vẫn cần được khai báo trong MyClass.h? – Akusete