sábado, 28 de agosto de 2010

Implementación explícita de interfaces en C#

Por diversas razones como la colisión de nombres o simplemente por diseño, puede que necesitemos mayor granularidad para distinguir que método de que interfaz estamos definiendo.

Supongamos que tenemos el caso de una clase que implementa dos interfaces tal y como sigue:

public interface IInterface1
{
int method();
int method1();
}

public interface IInterface2
{
int method();
int method2();
}

public class ExampleClass : IInterface1, IInterface2
{
public int method() { return 1; }
public int method1() { return 1; }
public int method2() { return 2; }

}

En este caso, el método method está presente en las dos interfaces y lo definimos en la clase.

Si necesitáramos distinguir alguno de los casos se podría usar la implementación explícita de interfaces.

public class ExampleClass : IInterface1, IInterface2
{
public int method() { return 1; }
public int method1() { return 1; }
public int method2() { return 2; }

int IInterface1.method() { return 1; }
int IInterface2.method() { return 2; }

}


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

ExampleClass example = new ExampleClass();
IInterface1 i1 = (IInterface1)example;
IInterface2 i2 = (IInterface2)example;

MessageBox.Show("Interface 1: " + i1.method());
MessageBox.Show("Interface 2: " + i2.method());
}
}

Esto devolvería como resultados 1 y 2 respectivamente. Como vemos, a pesar de realizar la implementación explícita de ambas interfaces se sigue pudiendo implementar de la forma tradicional como caso base.