2009-05-19 10 views
27

Digamos que tiene una interfaz de C# llamado IMyInterface define de la siguiente manera:La implementación de una interfaz declarado en C# de C++/CLI

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

Supongamos también tengo una clase ++/CLI C, MyConcreteClass, que implementa esta interfaz y cuya cabecera se declara como sigue:

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

}; 

¿Cómo se puede poner en práctica el método Foo y la propiedad MyProperty en la cabecera de C++/CLI?

mi intento resultados en el siguiente error de compilación:

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

Respuesta

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

Interfaces necesitan ser definidos como virtual. También tenga en cuenta el "público IMy .." después de la declinación de clase, es una sintaxis ligeramente diferente de C#.

Si puede, selle los miembros de la interfaz para mejorar el rendimiento, el compilador podrá vincular estos métodos con más fuerza que los miembros virtuales típicos.

Espero que ayude;)

No compilar, pero se ve bien a mí ... Ah, y también, la definición de sus métodos como __clrcall elimina peligros de dobles penalizaciones de rendimiento de procesador.

edición la sintaxis correcta para una propiedad es:

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

o, al poner la definición contenida en el archivo de origen:

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

Gracias por eso. ¿La declaración MyProperty no requiere la palabra clave 'propiedad'? Por ejemplo ... propiedad virtual String^MyProperty {String^__clrcall get() sealed {return String :: Empty; }} –

+0

¡Gracias Simón, debo haber sido visto desde esta maratón de 30 horas de extensión de codificación! =) – RandomNickName42

+1

ya que este es uno de los primeros hits en google, edité la respuesta con la sintaxis correcta para las propiedades, lo que es un poco complicado. – stijn

Cuestiones relacionadas