2009-05-19 11 views
27

मैं एक सी # IMyInterface बुलाया इंटरफेस इस प्रकार परिभाषित किया गया है कहो हेडर को इस तरह घोषित किया जाता है:एक अंतरफलक को लागू C++/CLI से सी # में घोषित

// C++/CLI header file 
ref class MyConcreteClass : IMyInterface 
{ 
public: 

}; 

कैसे एक विधि Foo और C++/CLI शीर्षक में संपत्ति MyProperty को लागू करता है?

निम्नलिखित संकलन त्रुटि में मेरे प्रयास के परिणाम:

error C3766: 'MyConcreteClass' must provide an implementation for the interface method 'void IMyInterface::Foo(System::String^ value)'

उत्तर

32
public ref class MyConcreteClass : public IMyInterface 
{ 
public: 
    virtual void __clrcall Foo(String^ value) sealed; 

    virtual property String^ __clrcall MyProperty 
     { String^ get() sealed { String::Empty; } } 
}; 

इंटरफेस आभासी रूप में परिभाषित किया जाना चाहिए। कक्षा की घोषणा के बाद "सार्वजनिक आईएम .." भी ध्यान दें, यह सी # की तुलना में एक बहुत ही अलग वाक्यविन्यास है।

यदि आप प्रदर्शन को बेहतर बनाने के लिए इंटरफ़ेस सदस्यों को सील कर सकते हैं, तो संकलक इन तरीकों को एक सामान्य आभासी सदस्यों की तुलना में अधिक कसकर बाध्य करने में सक्षम होंगे।

आशा है कि मदद करता है;)

मैं इसे संकलित नहीं किया लेकिन मेरे लिए अच्छा लग रहा है ... ओह और भी, अपने तरीके को परिभाषित करने __clrcall डबल thunk प्रदर्शन दंड के खतरों को समाप्त के रूप में।

संपादित एक संपत्ति के लिए सही सिंटैक्स है:

public ref class MyConcreteClass : public IMyInterface 
{ 
public: 
    virtual property String^ MyProperty 
    { 
    String^ get() sealed { return String::Empty; }; 
    void set(String^ s) sealed { }; 
    } 
}; 

या, जब स्रोत फ़ाइल में परिभाषा डाल:

public ref class MyConcreteClass : public IMyInterface 
{ 
public: 
    virtual property String^ MyProperty 
    { 
    String^ get() sealed; 
    void set(String^ s) sealed; 
    } 
}; 

String^ MyConcreteClass::MyProperty::get() 
{ 
    return String::Empty; 
} 

void MyConcreteClass::MyProperty::set(String^) 
{ 
    //... 
} 
+1

कि के लिए धन्यवाद। क्या माइप्रोपर्टी घोषणा को 'संपत्ति' कीवर्ड की आवश्यकता नहीं है? उदाहरण के लिए ... आभासी संपत्ति स्ट्रिंग^MyProperty {स्ट्रिंग^__clrcall() सीलबंद {वापसी स्ट्रिंग :: खाली; }} –

+0

धन्यवाद साइमन, मुझे इस मैराथन 30hour कोडिंग खिंचाव से पार किया जाना चाहिए !! =) – RandomNickName42

+1

चूंकि यह Google में पहली हिट्स में से एक है, इसलिए मैंने गुणों के लिए सही वाक्यविन्यास के साथ उत्तर संपादित किया है, जो कि थोड़ी मुश्किल है। – stijn

संबंधित मुद्दे