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