2009-05-19 39 views
27

Nói rằng tôi có một C# giao diện được gọi IMyInterface quy định như sau:Thực hiện một giao diện khai báo trong C# từ C++/CLI

// C# code 
public interface IMyInterface 
{ 
    void Foo(string value); 
    string MyProperty { get; } 
} 

Giả Tôi cũng có một C++/CLI lớp, MyConcreteClass, mà thực hiện giao diện này và có tiêu đề được khai báo như sau:

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

}; 

làm sao người ta thực hiện các phương pháp Foo và tài sản MyProperty trong tiêu đề C++/CLI?

kết quả nỗ lực của tôi trong các lỗi biên dịch sau:

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

Trả lời

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; } } 
}; 

giao diện cần phải được định nghĩa là ảo. Cũng lưu ý "công cộng IMY .." sau khi decleration lớp, đó là một cú pháp slighly khác với C#.

Nếu bạn có thể, đóng dấu các thành viên giao diện để cải thiện hiệu suất, trình biên dịch sẽ có thể ràng buộc các phương pháp này chặt chẽ hơn một thành viên ảo điển hình.

Hy vọng rằng sẽ giúp;)

Tôi không biên dịch nó, nhưng có vẻ tốt với tôi ... Oh và cũng định phương pháp của bạn như __clrcall loại bỏ mối nguy hiểm của hình phạt hiệu suất thunk đôi.

chỉnh sửa cú pháp chính xác cho một tài sản là:

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

hay, khi đặt định nghĩa trong file nguồn:

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

Cảm ơn vì điều đó. Tuyên bố MyProperty có yêu cầu từ khóa 'property' không? Ví dụ ... thuộc tính ảo String^MyProperty {String^__clrcall get() niêm phong {return String :: Empty; }} –

+0

Cảm ơn Simon, tôi phải được bắt mắt từ cuộc đua mã hóa kéo dài 30 giờ này! =) – RandomNickName42

+1

vì đây là một trong những lần truy cập đầu tiên trong google, tôi đã chỉnh sửa câu trả lời bằng cú pháp chính xác cho thuộc tính, điều này khá phức tạp. – stijn

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