@interface और @protocol स्पष्टीकरण?


82

मैं जानना चाहूंगा कि उद्देश्य C में @interface क्या है? क्या यह वही है जहाँ प्रोग्रामर चर, वर्ग नाम या विधि के नाम घोषित करना चाहता है ...? मुझे यकीन नहीं है कि यह जावा में इंटरफ़ेस की तरह है। और उद्देश्य सी में @protocol के बारे में भी। यह जावा में इंटरफ़ेस की तरह लगता है। किसी ने मुझे विस्तार से दे सकता है कृपया। मैं वास्तव में इसकी सराहना करता हूं।

जवाबों:


92

एक इंटरफ़ेस वह जगह है जहाँ आप वर्ग की विशेषताओं और संचालन को परिभाषित करते हैं। आपको कार्यान्वयन भी निर्धारित करना होगा।

एक प्रोटोकॉल जावा के लिए एक इंटरफेस की तरह है।

जैसे

@protocol Printing
    -(void) print;
@end

लागू किया जा सकता है

घोषित करके (इंटरफ़ेस में भ्रामक रूप से)

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

जावा डेवलपर्स के लिए भ्रामक बात यह है कि घुंघराले ब्रेसिज़ {}जैसे इंटरफ़ेस का अंत नहीं है

@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
कुल मिलाकर, बहुत अच्छा स्पष्टीकरण, लेकिन कुछ हद तक पक्षपाती के रूप में आता है कि जावा इसे "बेहतर" तरीके से करता है। इतनी सारी चीजों के साथ, शब्दावली भाषा के सापेक्ष है। यह याद रखने में मदद करता है कि ऑब्जेक्टिव-सी जावा की भविष्यवाणी करता है, और जावा ने इसे काफी हद तक आकर्षित किया, जिसमें प्रोटोकॉल से इंटरफेस की अवधारणा भी शामिल है। virtualschool.edu/objectivec/influenceOnJava.html यह यकीनन कम भ्रम की स्थिति में होता अगर जावा ने एक ही नाम को बरकरार रखा होता, लेकिन उन्होंने ऐसा नहीं किया क्योंकि जावा में एक अलग। एक संकलन इकाई के लिए इंटरफ़ेस "।
क्विन टेलर

22
@QuinnTaylor मैं यह नहीं कहना चाहता था कि 'Java इसे बेहतर बनाता है' लेकिन मैंने इसे इस तरह से प्रदर्शित किया जैसे कि ओपी ने जावा भाषा के संबंध में प्रश्न पूछा है।
जॉननो नोलन

2
केवल उद्देश्य C के दृष्टिकोण से, दोनों में क्या अंतर है? दोनों इस बात पर अमल करते दिखते हैं कि कुछ विधियाँ उन्हीं के आधार पर बनने वाली कक्षाओं द्वारा लागू की जाती हैं। अंतर केवल इतना है कि प्रोटोकॉल बोलने के लिए क्लासलेस हैं, जबकि इंटरफेस को लागू करने की आवश्यकता है?
सेक्सीबीस्ट

मुझे लगता है कि बेईमान हिस्सा यह है कि प्रोटोकॉल एक अमूर्त वर्ग नहीं है, बल्कि COM डिस्पेरफेस की तरह है। प्रत्येक स्मॉलटाक ऑब्जेक्ट को। ++ ऑब्जेक्ट्स के माध्यम से .x या .y के रूप में संदेश नहीं मिलता है (सी के अनुरूप myObject.lpVtbl->x(&myObject)) लेकिन एक दोहरे इंटरफ़ेस के माध्यम से, सी के अनुरूप myObject.lpVtbl->Invoke(&myObject, "x", &argArray);। इसके कारण, प्रोटोकॉल और इंटरफेस रनटाइम उत्पन्न करने के लिए जानकारी प्रदान करने और समय टाइप करने के लिए संकलन करने के लिए सेवा प्रदान करते हैं। जब तक आप अपनी परियोजना के लिए एक स्क्रिप्ट इंजन / COM परिचय नहीं करते हैं, तब तक C ++ में कोई भी समानांतर नहीं है।
दिमित्री

28

शायद अच्छा हो अगर आप इस पर एक नज़र डालें मुझे लगा कि इसे समझने में बहुत मदद मिली

लेख से:

@इंटरफेस

सी ++

फू

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

Foo.cpp

#include "Foo.h"
...

उद्देश्य सी

फू

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

फू ल

#import "Foo.h"

@implementation Foo
...
@end

@मसविदा बनाना

सी ++

struct MyInterface
{
  void foo() = 0;
}

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

उद्देश्य सी

@protocol MyInterface
-(void) foo;
@end

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

2
+1 महान संसाधन। उद्देश्य-सी दायरे में कदम रखते समय बहुत ज्यादा हर C / C ++ प्रोग्रामर का मार्गदर्शन करना।
किलवाट्ट1705

उपरोक्त उदाहरण के बारे में @protocolकुछ सामान्य तरीकों को @interfaceपरिभाषित करता है , कुछ कस्टम तरीकों को परिभाषित करता है और @implementationउस इंटरफ़ेस को लागू करता है। @interfaceकोई कार्यान्वयन नहीं किया है। अगर fooविधि प्रोटोकॉल के लिए समान है, तो इसे इंटरफ़ेस पर दोहराया नहीं जाना चाहिए।
SMMousavi

वाह, काश, मुझे वह लेख जल्दी मिल गया होता। C ++ से Obj तक आने में बहुत मददगार। सी, अत्यधिक, अत्यधिक किसी और को उस स्थिति में सलाह देते हैं कि उत्तर में जुड़े लेख की जांच के लिए समय व्यतीत करें
user7804781

15

@interfaceऑब्जेक्टिव-सी में जावा इंटरफेस के साथ कोई संबंध नहीं है। यह बस एक वर्ग के सार्वजनिक इंटरफ़ेस को घोषित करता है, इसका सार्वजनिक एपीआई। (और सदस्य चर, जैसा कि आप पहले ही देख चुके हैं।) जावा-शैली इंटरफेस को उद्देश्य-सी में प्रोटोकॉल कहा जाता है और @protocolनिर्देश का उपयोग करके घोषित किया जाता है । आपको Apple द्वारा ऑब्जेक्टिव-सी प्रोग्रामिंग लैंग्वेज को पढ़ना चाहिए , यह एक अच्छी किताब है - छोटी और बहुत ही सुलभ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.