En programando en C# 19 vamos a ver interface.
Este es un tema que, conceptualmente es un poco complicado de entender para que se usa. Esta herramienta mal usada, al igual que las herencias y polimorficmo, puede hacer que el programa funcione como corresponde, pero si querés modificar algo del programa, mejor dedicate a hacer uno nuevo.
El significado de interface es aquello que une dos cosas. En algunos casos une la visión del usuario con el programa que está manejando, esa sería la interface gráfica.
En realidad usar interfaces es unir dos objetos con comportamientos iguales, pero con naturalezas distintas. O sea, la interface comunica comportamientos, pero no comunica o une objetos que son distintos entre si.
Por ejemplo, tengo la clase persona, que tiene los atributos "Nombre", "Edad", "Sexo", y nada tiene que ver con la clase Perro que tiene también los atributos "Nombre", "Edad", "Sexo".
Si bien podemos hacer una clase abstracta que establezca los métodos que necesite cada clase y se pueda hacer heredada, conceptualmente es incorrecto hacerlo, por que el objeto Perro nada tiene que ver con el objeto Persona.
Entonces ahí si hacermos una interface, que contenga inicialmente los métodos que se necesiten para modelar los comportamientos de dichos objetos.
Es así que en el ejemplo quedaría:
La interface de ejemplo la escribí así:
El objeto Perro lo escribí así:
El objeto Persona es igual a Perro, pero sin tanto comentario:
El formulario lo escribí así:
Para el próximo "Programando" escribiré respecto de las excepciones y su uso, así como también validaciones.
Este es un tema que, conceptualmente es un poco complicado de entender para que se usa. Esta herramienta mal usada, al igual que las herencias y polimorficmo, puede hacer que el programa funcione como corresponde, pero si querés modificar algo del programa, mejor dedicate a hacer uno nuevo.
El significado de interface es aquello que une dos cosas. En algunos casos une la visión del usuario con el programa que está manejando, esa sería la interface gráfica.
En realidad usar interfaces es unir dos objetos con comportamientos iguales, pero con naturalezas distintas. O sea, la interface comunica comportamientos, pero no comunica o une objetos que son distintos entre si.
Por ejemplo, tengo la clase persona, que tiene los atributos "Nombre", "Edad", "Sexo", y nada tiene que ver con la clase Perro que tiene también los atributos "Nombre", "Edad", "Sexo".
Si bien podemos hacer una clase abstracta que establezca los métodos que necesite cada clase y se pueda hacer heredada, conceptualmente es incorrecto hacerlo, por que el objeto Perro nada tiene que ver con el objeto Persona.
Entonces ahí si hacermos una interface, que contenga inicialmente los métodos que se necesiten para modelar los comportamientos de dichos objetos.
Es así que en el ejemplo quedaría:
La interface de ejemplo la escribí así:
<?
namespace WindowsFormsApplication1
{
interface INombres
{
string GetNombre(); //Lo que hago es poner los nombres de los métodos que describirán la acción.
string GetSexo();//No se deben poner con la sentencia "public" o "private", por que es algo genérico.
string GetEdad();//Esto es como hacer una lista de acciones que se deben realizar.
}
}
>
El objeto Perro lo escribí así:
<?
namespace WindowsFormsApplication1
{
class Perro : INombres //Heredamos la interface como cualquier otra clase... ojo, si bien no funciona la multiple herencia, si se puede seguir heredando de otra clase si se hereda también de la interface.
{
private string Nombre, Sexo, Edad;//Atributos... en persona está igual, así que no pienso comentar mucho en esa clase.
public void SetDatos(string Nombre, string Sexo, string Edad)
{
this.Nombre = Nombre; //El "this" está diciendo que nos referimos a la variable que tenemos en la clase. Si es "this" solo, nos referimos a la clase completa.
this.Sexo = Sexo;
this.Edad = Edad;
}
public string GetNombre() //Los métodos modelados en la interface se tienen que escribir completos.
{
return Nombre;
}
public string GetSexo() //Un detalle, puede ser cualquier cosa, lo mio es a modo de ejemplo y devolviendo datos.
{
return Sexo;
}
public string GetEdad()
{
return Edad;
}
}
}
>
El objeto Persona es igual a Perro, pero sin tanto comentario:
<?
namespace WindowsFormsApplication1
{
class Persona: INombres
{
private string Nombre, Sexo, Edad;
public void SetDatos(string Nombre, string Sexo, string Edad)
{
this.Nombre = Nombre;
this.Sexo = Sexo;
this.Edad = Edad;
}
public string GetNombre()
{
return Nombre;
}
public string GetSexo()
{
return Sexo;
}
public string GetEdad()
{
return Edad;
}
}
}
>
El formulario lo escribí así:
<?
using System;
using System.Collections.Generic; //Esto permite hacer arrays normales, comunes y corrientes.
using System.ComponentModel;
using System.Data;
using System.Collections; //Esto permite hacer ArrayList, o vectores de lista, que mas adelante explicaré como funcionan, pero son vectores dinámicos.
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
ArrayList ListaPerros; //El ArrayList es una clase que debo instanciar.
ArrayList ListaPersonas;
public Form1()
{
InitializeComponent();
ListaPerros = new ArrayList(); //Si pongo un número en el paréntesis, se me crearán la cantidad de posiciones de vector que puse.
ListaPersonas = new ArrayList();//Cuando se llega al límite de números, los espacios se me duplican, pero no me daré cuenta de ello.
}
private void btnAgregar_Click(object sender, EventArgs e)
{
Perro ElPerro = new Perro(); //Instancio la clase Perro.
Persona LaPersona = new Persona(); //Instancio la clase Persona.
INombres Nomb; //Inicio la instanciación de la interface. Da error si la instancio completa. Lo mismo pasa con las clases abstractas.
Form2 VentanaAgregar = new Form2(); //Hice una ventana para adquirir datos.
if (VentanaAgregar.ShowDialog() == DialogResult.OK) //Con el botón OK toma los datos.
{
LaPersona.SetDatos(VentanaAgregar.tbNomDueñ.Text, (string)VentanaAgregar.cbSexDueñ.SelectedItem, VentanaAgregar.tbEdadDueñ.Text); //Pone los datos en persona.
ElPerro.SetDatos(VentanaAgregar.tbNomPerr.Text, (string)VentanaAgregar.cbSexPerr.SelectedItem, VentanaAgregar.tbEdadPerr.Text); //Pone los datos en perro.
Nomb = LaPersona; //El inicio de instanciación de la interface lo ocupo para decirle que los métodos que en ella estaban modelados, son los que tiene la clase que los usó, con sus datos y todo.
ListaPersonas.Add(Nomb);//Agrego en el Array de lista.
Nomb = ElPerro; //Sobreescribo el de perro (Ojo, no siempre es aconsejable hacerlo, pero como esto son pocos datos, me tomo el lujo de hacerlo).
ListaPerros.Add(Nomb);//Agrego en el Array de lista.
}
lbPerro.Items.Clear(); //Limpio los listbox que tengo para presentar los datos.
lbPersona.Items.Clear();
for (int p = 0; p < ListaPerros.Count; p++) //Un for donde p será la posición que recorre el vector y .Count funciona como .Lenght. Ojo, no usen .Capacity, por que son las posiciones de las que justo "No me doy cuenta que tiene el vector".
{
lbPerro.Items.Add("Nombre: " + ((INombres)ListaPerros[p]).GetNombre()); /*Acá está lo interesante, primero lo primero
* Cada vez que querramos usar esta clase de array, tenemos que poner entre paréntesis el tipo de objeto que buscamos que sea.
* La interface solo guarda los datos que ella modela, o sea que solo guardará los datos que retorna, en mi ejemplo.
* Si hubiera guardado todo en un mismo vector, la información hubiera sido distinta, dependiendo de la posición.**/
lbPerro.Items.Add("Sexo del animal: " +((INombres)ListaPerros[p]).GetSexo());
lbPerro.Items.Add("Edad: " + ((INombres)ListaPerros[p]).GetEdad());
lbPerro.Items.Add("-------------------------------------------");//Separador.
}
for (int p = 0; p < ListaPersonas.Count; p++)
{
lbPersona.Items.Add("Nombre: " + ((INombres)ListaPersonas[p]).GetNombre());
lbPersona.Items.Add("Sexo: " + ((INombres)ListaPersonas[p]).GetSexo());
lbPersona.Items.Add("Edad: " + ((INombres)ListaPersonas[p]).GetEdad());
lbPersona.Items.Add("-------------------------------------------");
}
}
private void btnSalir_Click(object sender, EventArgs e)
{
Application.Exit();//Botón que cierra el programa.
}
}
}
>
Para el próximo "Programando" escribiré respecto de las excepciones y su uso, así como también validaciones.