C# día 12: interfaces
En C# también se pueden crear interfaces como en Java, aunque el manejo de atributos se hace a través de las properties y es algo engorroso. Veamos un ejemplo básico:
Definimos el interfaz bebida y una clase que lo implementa, el café.
/**
* Interfaces.cs
* Programa que muestra el uso de interfaces. Al igual que en Java los interfaces son
* como clases abstractas pero sin implementación alguna. Su objetivo es servir como
* plantilla a las clases que lo implementan (sus métodos y atributos).
* Los interfaces no tienen constructores ni destructores, y todo es público.
*/
using System;
// Vamos a definir el interfaz Bebida
public interface Bebida
{
// No podemos meter atributos sin más,
// Hay que usar properties.
double precioLitro { get; set; }
string color{ get; set; }
string sabor{ get; set; }
int azucar { get; set; }
// Metemos algunos métodos, pero sin implementar.
// Las clases que implementen este interfaz, deberán
// tener este método.
void mostrar();
bool esDulce();
void echarAzucar(int cantidad);
}
// Vamos a usar una clase que implemente el interfaz bebida
public class Cafe : Bebida
{
// DEfinimos estos atributos y accedemos
// a ellos a través de los properties
private int azucarCafe;
private string saborCafe;
private string colorCafe;
private double precioLitroCafe;
// Implementamos las properties
public double precioLitro
{
get { return precioLitroCafe; }
set { precioLitroCafe = value; }
}
public string color
{
get { return colorCafe; }
set { colorCafe = value; }
}
public string sabor
{
get { return saborCafe; }
set { saborCafe = value; }
}
public int azucar
{
get { return azucarCafe; }
set { azucarCafe = value; }
}
// Método constructor
public Cafe()
{
azucar = 0;
precioLitro = 5.6;
}
// Implementaciones del interfaz //////////
// mostrar info
public void mostrar()
{
System.Console.WriteLine("Esto es un Café");
}
// Pregunta si la bebida es dulce
public bool esDulce()
{
if (sabor == "dulce")
{
return true;
}
else
{
return false;
}
}
// Echa azucar en el Café
public void echarAzucar(int cantidad)
{
azucar += cantidad;
}
// Método principal
public static void Main ()
{
Cafe cafeton = new Cafe();
cafeton.sabor = "dulce";
System.Console.WriteLine("Ya tenemos un cafe a {0:C#.##} /litro", cafeton.precioLitro);
// Probamos a ver...
if (cafeton.esDulce())
{
System.Console.WriteLine("Y está muy dulce");
}
}
}
Y ahora un ejemplo de implementación de multiples interfaces: Bebida y Estimulante. Dicen que es una aproximación a la herencia multiple. Anda que...
// Vamos a definir otro interfaz
public interface Estimulante
{
// Properties
double cafeina { get; set; }
double teina { get; set; }
double taurina { get; set; }
double cachondina { get; set; }
// Metodos
void mostrar();
bool esMortal();
}
// Y ahora vamos a implementar este y otro interfaz
public class RezBull : Bebida, Estimulante
{
private double RBCafeina;
private double RBTeina;
private double RBTaurina;
private double RBCachondina;
// Properties
public double cafeina
{
get { return RBCafeina; }
set { RBCafeina = value; }
}
public double teina
{
get { return RBTeina; }
set { RBTeina = value; }
}
public double taurina
{
get { return RBTaurina; }
set { RBTaurina = value; }
}
public double cachondina
{
get { return RBCachondina; }
set { RBCachondina = value; }
}
// DEfinimos estos atributos y accedemos
// a ellos a través de los properties
private int azucarCafe;
private string saborCafe;
private string colorCafe;
private double precioLitroCafe;
// Implementamos las properties
public double precioLitro
{
get { return precioLitroCafe; }
set { precioLitroCafe = value; }
}
public string color
{
get { return colorCafe; }
set { colorCafe = value; }
}
public string sabor
{
get { return saborCafe; }
set { saborCafe = value; }
}
public int azucar
{
get { return azucarCafe; }
set { azucarCafe = value; }
}
// Constructor
public RezBull ()
{
taurina = 66.6;
teina = 0.0;
cafeina = 453.98;
}
// Implementaciones del interfaz //////////
// Pregunta si la bebida es dulce
public bool esDulce()
{
return false;
}
// Echa azucar en el RezBull
public void echarAzucar(int cantidad)
{
azucar += cantidad;
}
// Mostrar. Para distinguir entre los dos interfaces, ponemos el prefijo
void Bebida.mostrar()
{
System.Console.WriteLine("Esta es una bebida inclasificable");
}
// Mostrar. Para distinguir entre los dos interfaces, ponemos el prefijo
void Estimulante.mostrar()
{
System.Console.WriteLine("Esta bebida mata, o eso dicen");
}
// Implementacion sencilla de esMortal
bool Estimulante.esMortal()
{
return true;
}
}
pello.io