@interface và @protocol giải thích?


82

Tôi muốn biết @interface trong mục tiêu C là gì? có phải chỉ là nơi lập trình viên muốn khai báo các biến, tên lớp hay tên phương thức ...? Tôi không chắc liệu nó có giống như giao diện trong Java hay không. Và cả về @protocol trong mục tiêu C. Có vẻ như giao diện trong Java hơn. Bất cứ ai có thể cho tôi lời giải thích chi tiết xin vui lòng. Tôi thực sự đánh giá cao nó.

Câu trả lời:


92

Giao diện là nơi bạn xác định các thuộc tính và hoạt động của lớp. Bạn cũng phải thiết lập việc triển khai.

Một giao thức giống như một giao diện cho java.

ví dụ

@protocol Printing
    -(void) print;
@end

có thể được thực hiện

bằng cách khai báo (khó hiểu trong giao diện)

@interface Fraction: NSObject <Printing, NSCopying> {
//etc..

Điều khó hiểu đối với các nhà phát triển java là các dấu ngoặc nhọn {}không phải là phần cuối của giao diện, ví dụ:

@interface Forwarder : Object
{
    id recipient; 
} //This is not the end of the interface - just the operations


- (id) recipient;
- (id) setRecipient:(id) _recipient; 
//these are attributes.

@end
//This is the end of the interface

10
Nhìn chung, lời giải thích khá hay, nhưng có phần hơi thiên vị rằng Java làm theo cách "tốt hơn". Cũng như rất nhiều thứ, thuật ngữ có liên quan đến ngôn ngữ. Cần nhớ rằng Objective-C có trước Java và Java đã rút ra khá nhiều điều từ nó, bao gồm cả khái niệm về giao diện từ các giao thức. Virtualschool.edu/objectivec/influenceOnJava.html Có thể sẽ ít gây nhầm lẫn hơn nếu Java giữ lại cùng một tên, nhưng họ không làm vậy vì Java không có tệp .h riêng biệt (trong C / C ++) chứa " giao diện "cho một đơn vị biên dịch.
Quinn Taylor

22
@QuinnTaylor Tôi không muốn nói 'Java làm tốt hơn' nhưng tôi đã diễn giải nó theo cách đó khi OP đặt câu hỏi liên quan đến ngôn ngữ Java.
Johnno Nolan

2
Chỉ từ quan điểm của Objective C, sự khác biệt giữa hai điều này là gì? Cả hai dường như để thực thi rằng các phương thức nhất định được thực hiện bởi các lớp được hình thành dựa trên chúng. Có phải sự khác biệt duy nhất là các giao thức là không phân lớp , trong khi các giao diện cần phải được triển khai?
SexyBeast

tôi nghĩ rằng phần không trung thực là giao thức không phải là một lớp trừu tượng, mà giống như COM dispinterface. Mọi đối tượng smalltalk đều nhận được thông báo không phải qua .x hoặc .y như trong các đối tượng c ++ (tương tự như c myObject.lpVtbl->x(&myObject)) mà thông qua giao diện kép, tương tự như c myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. Do đó, các giao thức và giao diện dường như phục vụ để cung cấp cho trình biên dịch thông tin để tạo thời gian chạy và đánh máy thời gian biên dịch. Vì vậy, không có sự song song thực sự trong C ++ trừ khi bạn giới thiệu công cụ tập lệnh / COM cho dự án của mình.
Dmitry

28

có lẽ tốt nếu bạn nhìn vào điều này + Tôi nghĩ rằng nó rất hữu ích để hiểu

Từ bài báo:

@interface

C ++

Foo.h

#ifndef __FOO_H__
#define __FOO_H__
class Foo
{
...
};

Foo.cpp

#include "Foo.h"
...

Objective-C

Foo.h

@interface Foo : NSObject
{
...
}
@end

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@protocol

C ++

struct MyInterface
{
  void foo() = 0;
}

class A : MyInterface
{
public:
  void override foo() { ... }
}

Objective-C

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end

2
+1 Tài nguyên tuyệt vời. Khá nhiều hướng dẫn cho mọi lập trình viên C / C ++ khi bước vào lĩnh vực Objective-C.
KillAWatt1705

Về ví dụ trên @protocolxác định một số phương thức chung, @interfacexác định một số phương thức tùy chỉnh và @implementationtriển khai giao diện đó. @interfacekhông có bất kỳ thực hiện. Ngoài ra, nếu foophương thức giống với phương thức của giao thức, vì vậy nó không nên lặp lại trên giao diện.
SMMousavi

Chà, tôi ước gì mình tìm thấy bài báo đó sớm hơn. Rất hữu ích khi chuyển từ C ++ sang obj. C, thực sự , rất khuyến khích bất kỳ ai khác ở vị trí đó dành thời gian để xem bài viết được liên kết trong câu trả lời.
user7804781

15

Trong @interfaceObjective-C không liên quan gì đến các giao diện Java. Nó chỉ đơn giản là khai báo một giao diện công khai của một lớp, API công khai của nó. (Và các biến thành viên, như bạn đã quan sát.) Các giao diện kiểu Java được gọi là giao thức trong Objective-C và được khai báo bằng cách sử dụng @protocolchỉ thị. Bạn nên đọc Ngôn ngữ lập trình Objective-C của Apple, đây là một cuốn sách hay - ngắn và rất dễ tiếp cận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.