interface2

06/09/2003 - 00:06 por ErickGB | Informe spam
no entiendo que beneficio me traeria tratar A como alguna
interface, suponiendo A : IA, IB, IC.
Aun no veo el beneficio de las interfaces si tengo que
definir todos los metodos en las clases donde la implemento
Siento como si hubiera redundancia, para que declarar una
interface si tengo que definirla al implementarla
Que ventaja da si implemento la interface a si solo
declaro los metodos como si fueran propios de la clase.
 

Leer las respuestas

#1 Federico Villafañes
06/09/2003 - 14:12 | Informe spam
Se va a entender mejor con un ejemplo:

Supongamos que quieres agregar un metodo a todos los componentes
que se pueden agregar a una form como el TextBox, CheckBox, etc, y
que quieres que este metodo "Ponga a Cero" el valor del componente.
Digamos que el metodo se llama "ResetearTodo()".

Ahora, te encuentras con que este metodo tendra distinta implementacion
segun este alojado en un CheckBox o en un TextBox, dado que en el
primero deberia poner el valor a FALSE, y en el segundo el texto a "".

En tu form, quieres poner un loop para llamar a los metodos "ResetearTodo()"
de todos los componentes contenidos en la form, y ahi te vas a encontrar con
el problema, que se puede resolver sin interfaces, pero la solucion no es
tan
elegante y util.

Empecemos con las definiciones:
*************************************************************
public interface MiInterface
{
void ResetearTodo();
}

public class MiTextBox : System.Windows.Forms.TextBox, MiInterface
{
public MiTextBox() : base () {}
public void ResetearTodo()
{
base.Text = "";
}
}

public class MiCheckBox: System.Windows.Forms.CheckBox, MiInterface
{
public MiCheckbox() : base() {}
public void ResetearTodo()
{
base.Value = false;
}
}

***********************************************************
Ahora, veamos como podriamos llamar al metodo ResetearTodo de cada
uno de los componentes, suponiendo que en la form podrian existir controles
normales y controles de los creados heredados:

public void Resetear()
{
foreach(object obj in this.Controls)
{
if(obj is TextBox)
((TextBox) obj).Text = "";
else if(obj is CheckBox)
((CheckBox) obj).Value = false;
}
}

Con nuestra implementacion del interface, se podria hacer algo asi:

public void Resetear()
{
foreach(object obj in this.Controls)
if(obj is MiInterface)
((MiInterface) obj).ResetearTodo();
}

Y ojo que el codigo anterior asume que no todos los controles de
la form podrian implementar el interface "MiInterface". Si estuvieramos
seguros que en nuestra form solo agregamos componentes "Mi...",
entonces podriamos hacer:

public void Resetear()
{
foreach(MiInterface obj in this.Controls)
obj.ResetearTodo();
}

Observa que si, posteriormente, aparte del TextBox y el CheckBox
quisieramos personalizar el Label, pero de forma que no se toque el
texto, entonces escribiriamos algo asi como:

public class MyLabel : System.Windows.Forms.Label, MiInterface
{
public MyLabel() : base () {}
public void ResetearTodo()
{
base.Text = "Vacio";
}
}

y no necesitariamos tocar nada en el codigo "Resetear" de la form,
pues el "MiLabel" se camufla inmediatamente en "MiInterface" cuando
lo necesitamos. Sin embargo, si no hubieramos utilizado interfaces,
deberiamos haber ido tambien a la form y modificar:

public void Resetear()
{
foreach(object obj in this.Controls)
{
if(obj is TextBox)
((TextBox) obj).Text = "";
else if(obj is CheckBox)
((CheckBox) obj).Value = false;
else if(obj is Label)
((Label) obj).Text = "vacio";
}
}

¿Se entiende?

Federico

Preguntas similares