2009-03-20 16 views
5

Tôi thấy rất nhiều mã như sau càng về cuối:Làm thế nào để một giao thức trên một biến cá thể trong Objective-C hoạt động?

id<foo> aBar; 

Thông thường đây là điều mà tôi muốn nhìn thấy trong một khai báo lớp, chẳng hạn như:

@interface bar : UIViewController <UITableViewDelegate, UITableViewDataSource> 

Có giá trị trung bình trên rằng aBar có thể là một thể hiện của thanh lớp và hứa hẹn sẽ có tất cả các phương thức được khai báo trong giao thức foo?

Trả lời

16

Đóng. Điều này có nghĩa là aBar sẽ là một phiên bản của lớp phù hợp với giao thức foo. Nó có thể là bar (nếu lớp đó phù hợp với foo) hoặc một lớp khác phù hợp với foo. Tất cả những gì bạn biết từ tuyên bố đó là aBar phù hợp với giao thức.

Ngoài ra, chúng chỉ được kiểm tra tại thời gian biên dịch chứ không phải thời gian chạy. Có thể đặt một đối tượng trong aBar không phải là một thể hiện của một lớp phù hợp với foo. Nhưng trình biên dịch sẽ cảnh báo bạn về nó trong hầu hết các trường hợp.

+0

Có thể có một số 'foo' và 'bar' được hoán đổi trong câu hỏi và câu trả lời. Lớp 'bar' của anh ta không chấp nhận giao thức foo, do đó trình biên dịch sẽ phàn nàn về việc lưu trữ một thể hiện của 'bar' thành 'aBar' khi nó được viết. –

+0

Tôi không nghĩ rằng có bất kỳ swappage, nhưng bạn đang phải về các lớp học thanh không phù hợp với các giao thức foo. Tôi nghĩ đoạn cuối của anh ấy giải thích lý do tại sao anh ấy đã viết nó theo cách đó. –

0

Chính xác. Các giao thức có nghĩa là bạn không kế thừa lớp nhưng nhận các phương thức nguyên mẫu của lớp đó. Bằng cách này bạn sẽ biết phương thức stubs là gì khi bạn đang cố gắng tương tác với một đối tượng yêu cầu các phương thức đó. Hãy suy nghĩ của một giao diện nông trong C#.

Tôi nói C# vì đó là ngôn ngữ chính của tôi. :)

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