2011-10-01 34 views
15

Tôi có một câu hỏi về bài tập về nhà khiến tôi bối rối, thực sự rất tệ. Dưới đây là giải thích ngắn gọn về một câu hỏi.Cách sử dụng giao thức C mục tiêu

Hãy tưởng tượng bạn đang phát triển một ứng dụng lưu trữ thông tin liên hệ . Sổ địa chỉ có thể chứa nhiều loại thực thể, ví dụ: Con người là, một công ty hoặc bất kỳ điều gì khác có thông tin liên hệ.

  • Bây giờ thay vì kiểm tra một cách rõ ràng tất cả các loại đối tượng viết một giao thức rằng tuyên bố như thế nào một đối tượng phải cư xử và thành công xuất hiện trong sổ địa chỉ của bạn.

sự hiểu biết và nỗ lực của việc trả lời câu hỏi này của tôi là,

  1. Xây dựng một giao thức trong đó có phương pháp phổ biến của từng loại thông tin liên lạc dưới @required thẻ. Và tất cả các phương pháp khác không tương tự trong liên hệ khác nhau (Chẳng hạn như số fax có liên kết với công ty nhưng không phải là người ...) dưới @optional. Khi chạy, bạn có thể kiểm tra xem một đối tượng có phản ứng với bất kỳ phương thức đã cho nào không bằng cách sử dụng selector. Doubt: Tuy nhiên điều này một lần nữa kiểm tra một cách rõ ràng loại đối tượng gián tiếp, tôi có đúng không?

  2. Suy nghĩ thứ hai của tôi là sử dụng thứ gì đó như abstract class trong java. Điều này có nghĩa là lớp được thừa hưởng từ lớp trừu tượng thực hiện các phương thức trừu tượng của riêng chúng. Làm thế nào bao giờ hết là một nhà phát triển iOS ngây thơ tôi không biết làm thế nào để thực hiện điều này? và tôi không chắc liệu điều này sẽ giải quyết được vấn đề của tôi hay không. Tôi muốn có được giác ngộ nếu ai đó biết điều này.


Reading ngoài thực hiện cho đến nay, Xin vui lòng cho tôi biết nếu câu trả lời Tôi đang tìm kiếm là một trong những liên kết này. Tôi sẽ đọc lại nó để hiểu và giải quyết vấn đề này :). cảm ơn.

  1. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF144

  2. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF146

  3. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF149

+5

Cách tuyệt vời để đặt câu hỏi về bài tập về nhà. +1 để theo dõi http://catb.org/esr/faqs/smart-questions.html – 0x8badf00d

+0

Liên kết này giải thích các khái niệm Giao thức rõ ràng http://www.tutorialspoint.com/ios/ios_delegates.htm –

Trả lời

10

Một giao thức là điều tương tự như một giao diện Java. Nó chỉ định nghĩa các phương thức mà lớp sẽ hỗ trợ. Dưới đây là một trang giải thích rõ ràng: http://www.otierney.net/objective-c.html#protocols

Về cơ bản nếu bạn muốn chắc chắn một lớp sẽ có một phương pháp phoneNumber (accessor đến phoneNumber tài sản) bạn sẽ làm một cái gì đó như thế này:

@protocol ContactProtocol 
-(void) phoneNumber; 
@end 

@interface Person: NSObject <ContactProtocol> { 
    ... 
} 

@interface Company: NSObject <ContactProtocol> { 
    ... 
} 

Và sau đó tại thời gian biên dịch (hoặc sống cho xcode 4) nó sẽ cho bạn biết nếu bạn quên thêm phương thức phoneNumber vào các lớp Person hoặc Company.

+6

Giao thức không giống như các lớp trừu tượng; thay vào đó chúng tương tự với các giao diện trong Java. Khi bạn lấy được một lớp từ một lớp trừu tượng, bạn kế thừa cả hai phương thức và cách triển khai của chúng. Với giao diện, bạn chỉ nhận được các khai báo. Điều này cũng đúng với các giao thức Obj-c - khi bạn khai báo rằng một lớp thực hiện một giao thức, bạn phải cung cấp các phương thức triển khai thực hiện. – Caleb

+0

Bạn hoàn toàn đúng. Tôi đã suy nghĩ về giao diện! Tôi đang cập nhật câu trả lời của mình. –

+0

Liên kết tới Otierney.net hiện đang ngừng hoạt động. Đây là một liên kết đến bộ nhớ cache của Google, không chắc chắn nó sẽ hoạt động được bao lâu.http://webcache.googleusercontent.com/search?q=cache:QbGm74kZa1wJ:www.otierney.net/objective-c.html+&cd=1&hl=vi&ct=clnk&gl=us – kevins

4

Tuy nhiên điều này một lần nữa kiểm tra rõ ràng loại đối tượng gián tiếp, tôi có đúng không?

Không, việc kiểm tra hành vi khác với loại kiểm tra. Bạn có thể gửi -respondsToSelector: cho bất kỳ đối tượng nào và nếu kết quả là CÓ, bạn có thể gửi tin nhắn bất kể loại đối tượng. Bạn cũng có thể yêu cầu một đối tượng thực hiện một giao thức nhất định, một lần nữa mà không cần quan tâm đến loại hình thực tế của nó:

id<SomeProtocol> foo; // foo points to any type that implements SomeProtocol 

suy nghĩ thứ hai của tôi là sử dụng một cái gì đó giống như lớp trừu tượng trong java.

Điều đó có thể hiệu quả, nhưng dường như không phải nhiệm vụ của bạn được yêu cầu, đúng không? Nó nói "... viết một giao thức ..."

Mục tiêu-C không cung cấp một cách rõ ràng để làm cho một lớp trừu tượng theo cách của Java. Bạn chỉ cần tạo ra các lớp học, và nếu bạn không muốn nó được instantiated trực tiếp bạn tài liệu đó một nơi nào đó.

+0

Câu hỏi này không phải về Swift, nhưng nếu đó là sau đó, xin vui lòng sửa tôi nếu tôi sai: Câu trả lời đầu tiên của bạn sẽ là: Có, bây giờ trong Swift, giao thức là một loại và chỉ đơn giản là bạn làm 'delegate? .omeMethod' trong khi không giống với' respondsToSelector' nó sẽ chạy chức năng nếu một đại biểu được thiết lập ... Câu hỏi thứ hai: (sau khi đọc bình luận của bạn cho câu trả lời được chấp nhận) trong Swift vì bạn cũng có thể cung cấp các triển khai mặc định cho các giao thức giống như lớp trừu tượng. – Honey

+1

@Honey Câu trả lời này đặt trước Swift và phải được đọc trong ngữ cảnh đó. Cùng đi cho bình luận của tôi. Và ngay cả khi câu hỏi và câu trả lời tương đương với Swift, tiêu đề của câu hỏi * rõ ràng * nói "Mục tiêu-C" và câu hỏi được gắn thẻ [tag: objective-c]. – Caleb

+0

Tôi thực sự biết rằng, tôi chỉ hỏi về nó khác với Swift, Có câu trả lời trong chủ đề này và tôi chỉ kiểm tra nếu tôi có thể đặt mọi thứ lại với nhau (đặc biệt là cùng với bình luận của bạn ở trên) một cách chính xác. – Honey

1

Bạn có ... tùy chọn.

Phương pháp tùy chọn thuận tiện cho người viết lớp học phù hợp với giao thức, gây phiền nhiễu cho người sử dụng giao thức. Vì vậy, nó phụ thuộc vào những người bạn đang cố gắng để làm hài lòng.

Phương pháp tùy chọn không tệ như kiểm tra loại. Hãy tưởng tượng mã sẽ trông như thế nào khi truy cập một đối tượng thực thể có thể liên lạc. Khi bạn sử dụng một phương pháp tùy chọn, bạn phải có một trường hợp nếu và một trường hợp khác. Nó không phải là thuận tiện như chỉ đi trước và giả sử bạn có thể gọi phương thức. Nhưng đó là cách thuận tiện hơn so với kiểm tra loại. Đó sẽ là một trường hợp nếu mỗi loại thực thể khác nhau (và một trường hợp khác, có thể là xác nhận). Ngoài ra, nếu bạn sử dụng các phương thức tùy chọn, thông tin về thực thể được đóng gói trong lớp của nó. Nếu bạn kiểm tra kiểu trước khi gọi một phương thức, thì thông tin về loại thông tin liên hệ mà một thực thể cung cấp nằm ngoài lớp trong mã gọi. Nếu bạn nâng cấp thực thể để cung cấp một loại liên hệ bổ sung, cải tiến đó sẽ không khả dụng cho đến khi bạn cập nhật mã gọi.

Tùy chọn B là thực hiện tất cả các phương pháp được yêu cầu, nhưng cung cấp cho họ tùy chọn trả lại giá trị cho biết không có thông tin nào, chẳng hạn như số không. Tất nhiên đó vẫn có nghĩa là một trường hợp nếu kiểm tra kết quả nil, nó chỉ là tiết kiệm hơn. Một giải pháp thậm chí tốt hơn cho vấn đề này là để có các phương thức trả về bộ sưu tập của nhiều địa chỉ liên lạc. Xét cho cùng, mọi người có thể có nhiều số điện thoại. Sau đó, để chỉ ra rằng một loại liên lạc không được áp dụng, bạn sẽ chỉ trả lại một bộ sưu tập trống.

Nhược điểm là bất cứ ai viết lớp phù hợp với giao thức phải thêm một phương thức sơ khai đơn giản có nội dung là return nil hoặc thứ gì đó.

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