2011-06-18 51 views
5

Tôi đã đọc lên các Giao thức và Thể loại Mục tiêu-c và cả hai dường như khá vô nghĩa đối với tôi. Cả hai đều được sử dụng để thêm những thứ vào chương trình một cách hài hước thay vì chỉ thêm thủ công nó.Mục tiêu-c - Mục đích của các loại và giao thức

Tôi có thể bị thuyết phục để xem mục đích của giao thức là để bạn có thể kiểm tra loại id, nhưng đó thực sự là về nó. Tôi không thấy sử dụng thực sự nào khác cho họ.

Đối với các danh mục, tôi thực sự không thấy lý do bạn không chỉ thêm chúng vào mã. Tại sao bạn cần phải xác định thủ công các phương thức trong một thể loại mà bạn sẽ thực hiện như trái ngược với việc chỉ làm nó bình thường? Có phải bạn muốn tạo một "phân lớp" nhưng với những sửa đổi nhỏ? Tại sao không chỉ tạo một lớp con?

Tôi thực sự không nhìn thấy mục đích của một trong những, tôi hy vọng ai đó có thể cho tôi biết sử dụng thực tế của họ =/

Cảm ơn trước, Christian

Trả lời

15

Danh mục là thêm phương thức vào các lớp không có nguồn gốc cho bạn, chẳng hạn như tất cả các lớp của Apple (bắt đầu bằng NS, CG, CA, v.v.) mà không cần phải phân lớp chúng.

Mục đích của giao thức là xác định các phương thức mà các lớp tuân theo giao thức đó phải thực hiện. Trong Java, chúng được gọi là giao diện. Mục đích là để mã hóa sự giống nhau giữa các lớp không phải là anh chị em (các lớp con của cùng một lớp cha). Giả sử bạn có một lớp Chair và một lớp Petrol. Chúng không có nhiều điểm chung, ngoại trừ việc cả hai đều tuân thủ giao thức flammable, yêu cầu chúng phải có một số phương pháp nhất định, chẳng hạn như specificEnergyflamingPoint.

Bây giờ, lớp Fire của bạn có thể có phương thức addFlammableMaterial:(id <flammable>)material.

Giao thức thường được sử dụng để khai báo rằng các phiên bản của các lớp nhất định có thể là đại biểu cho một số trường hợp khác.Bạn có thể khai báo bộ điều khiển xem của mình để hoạt động như nguồn dữ liệu thành UITableView bằng cách tuyên bố nó tuân theo giao thức UITableViewDataSource, có nghĩa là viewController của bạn đảm bảo rằng nó thực hiện các phương thức cần thiết của giao thức đó và tableView có thể an toàn. VC là nguồn dữ liệu của nó.

+1

Chúc mừng, điều đó thực sự đã giúp ích rất nhiều :) – JheeBz

4

Một loại là một cách để thêm các phương thức mới vào tất cả các cá thể của một lớp đang tồn tại mà không sửa đổi chính lớp đó.

Đối với loại đọc SO đã thảo luận bài viết,

What is the difference between inheritance and Categories in Objective-C

protocol-versus-category

Giao thức được sử dụng thường xuyên để xác định các giao diện cho các đối tượng đại biểu.

Các phương thức khai báo giao thức có thể được thực hiện bởi bất kỳ lớp nào. Giao thức rất hữu ích trong ít nhất ba tình huống:

To declare methods that others are expected to implement 
To declare the interface to an object while concealing its class 
To capture similarities among classes that are not hierarchically related 

read more uses of protocols.

+0

Câu hỏi ban đầu của tôi không phải là "Giao thức và danh mục" là gì, đó là "tại sao bạn sử dụng các giao thức và danh mục?" Tôi hiểu giao thức và danh mục là gì, tôi không biết khi nào bạn sẽ sử dụng chúng hoặc tại sao. – JheeBz

+0

@ JheeBz: Tôi chỉ trả lời những gì bạn hỏi. ** sử dụng giao thức ** với liên kết táo và cũng cung cấp cho bạn liên kết bài viết SO để tách ra khái niệm kế thừa và danh mục, mà bạn đã đề cập trong bài đăng của mình dưới dạng lớp con. – Jhaliya

1

Categories thể được sử dụng để thêm chức năng đến các lớp học hiện có, chẳng hạn như tất cả các NS ... các lớp học. Bạn không thể thêm mã trực tiếp vào các mã này.

Giao thức được sử dụng để chỉ định rằng một lớp nhất định thực sự làm điều gì đó, khi bạn gọi một phương thức trong giao thức.

2

Giao thức hoạt động như giao diện trong Java. Bạn có thể định nghĩa giao thức với một số phương thức và sau đó thực hiện nó trong nhiều lớp. Mỗi lớp này có thể có các phương thức khác nhau được cung cấp bởi giao thức, nhưng giao diện sẽ giống nhau. Ví dụ: bạn muốn tính mức lương của các loại nhân viên khác nhau, ví dụ: FullTimeEmployeeContractEmployee. Bạn có thể đặt định nghĩa phương thức calculateSalary trong giao thức và cung cấp các triển khai khác nhau trong hai lớp này, ví dụ: một người sẽ trả lương cố định trong khi người kia sẽ trả lương theo giờ làm việc. Sau đó, bạn có thể bỏ từng cá thể lớp thành kiểu giao thức và gọi phương thức đã cho nhận các kết quả thích hợp.

Danh mục hữu ích nếu bạn muốn mở rộng một lớp học không thuộc về bạn, chẳng hạn như trong trường hợp các lớp được cài sẵn, ví dụ: NSString. Bạn có thể thêm phương thức như reverse để nhận chuỗi bị đảo ngược. Tại sao không tạo một phân lớp? Vì bạn có thể gọi phương thức tùy chỉnh của mình trên lớp đã sửa đổi mà không cần tham chiếu đến loại của bạn.

2

Giao thức là cách áp dụng hợp đồng mã cho một lớp, giống như cách giao diện hoạt động trong Java và C#.

Danh mục hữu ích để mở rộng các lớp mà bạn không thể sửa đổi trực tiếp, chúng rất giống với các phương pháp Mở rộng trong C#.

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