Inyección de dependencia
Las interfaces nos permiten desacoplar las funciones al no depender de una clase, sino de la implementación de un interfaz:
https://anexsoft.com/ejemplo-de-inyeccion-de-dependencias-con-c
Definición:
Gente que está en contra (en ocasiones):
Explicación interfaces
En este enlace queda muy claro:
Curso interfaces c#
Aquí también lo explican bien:
Ejercicio herencia
Arreglar la siguiente jerarquía de herencias para que incorpore constructores en las clases derivadas y funcione el área:
abstract class Figuras { abstract function area(); } abstract class Bidimensional extends Figuras{ } class Circulo extends Bidimensional{ private $radio; } class Triangulo extends Bidimensional{ private $base; private $altura; } abstract class Tridimensional extends Figuras{ } class Cubo extends Tridimensional{ private $lado; } class Esfera extends Tridimensional{ private $radio }
Propiedades estáticas
class Estaticas { static public $iva; public $nombre; } $a=new Estaticas(); $b=new Estaticas(); $c=new Estaticas(); Estaticas::$iva=.21; $a->nombre="Ana"; $b->nombre="Eva"; $c->nombre="Rosa"; var_dump($a::$iva); var_dump($b::$iva); var_dump($c::$iva); class Producto{ static private $iva=.21; public $nombre; public $precio; function __construct($nombre,$precio) { $this->nombre=$nombre; $this->precio=$precio; } function PVP(){ return $this->precio*(1+$this::$iva); } } $manzana=new Producto("Manzana",2); echo $manzana->PVP(); $uvas=new Producto("Uvas",3.5); echo $uvas->PVP();
Clases abstractas y polimorfismo
<?php abstract class Figuras { abstract function dibujar(); function saludo(){ echo "Hola"; } } abstract class Bidimensional extends Figuras{ } class Circulo extends Bidimensional{ function dibujar(){ echo "Estoy dibujando un círculo"; } } class Hexagono extends Bidimensional{ function dibujar(){ echo "Dibujando hexágono"; } } abstract class Tridimensional extends Figuras{ } class Cubo extends Tridimensional{ function dibujar(){ echo "Esto es un cubo"; } } class Piramide extends Tridimensional{ function dibujar(){ echo "Porámide"; } } $figuras=[new Circulo(),new Piramide(), new Cubo(),new Hexagono(),new Circulo()]; foreach ($figuras as $figura){ $figura->dibujar(); }
Otro ejemplo polimorfismo
class Persona { private string _nombre; public Persona(string nombre) { Console.WriteLine("Constructor persona " + nombre); this.Nombre = nombre; } public string Nombre { set { this._nombre = value; } get { return this._nombre; } } public virtual string saludo() { return "Hola "+Nombre+" que tal"; } } class Empleado :Persona { public Empleado(string nombre, int sueldo=0) : base(nombre) { Console.WriteLine("Constructor empleado " + nombre); this.Cargo = "Empleado"; } public int Sueldo { get; set; } private string _cargo; public string Cargo { set { this._cargo = value; } get { return this._cargo; } } public override string saludo() { return "Hola empleado " + Nombre + " ¿Todo bien?"; } public virtual double sueldoNeto() { return Sueldo * .85; } } class Gerente : Empleado { public int Bono { get; set; } public int Dietas { get; set; } public Gerente(string nombre) : base(nombre) { Console.WriteLine("Constructor gerente " + nombre); this.Cargo = "Gerente"; } public Gerente(string nombre, int sueldo) : base(nombre, sueldo) { } public Gerente(string nombre, int sueldo, int dietas) : this(nombre, sueldo) { Dietas = dietas; } public override string saludo() { return "Hola Sr. " + Nombre + " ¿Desea alguna cosa?"; } public override double sueldoNeto() { return base.sueldoNeto()+Dietas; } } sealed class Direccion : Gerente { public int StockOptions { get; set; } public Direccion(string nombre) : base(nombre, 100) { Console.WriteLine("Constructor direccion " + nombre); } public Direccion(string nombre, int sueldo) : base(nombre, sueldo) { } public Direccion(string nombre, int sueldo, int dietas):base(nombre, sueldo, dietas) { } public Direccion(string nombre, int sueldo, int dietas, int stockoptions) : this(nombre, sueldo, dietas) { this.StockOptions = stockoptions; } public override string saludo() { return "Buenos días Sr. " + Nombre + " Estamos a sus órdenes"; } public override double sueldoNeto() { return base.sueldoNeto()+StockOptions*.5; } } class Cliente : Persona { public Cliente(string nombre) : base(nombre) { } }
Uso:
Empleado eva = new Empleado("Eva",1200); Gerente ana = new Gerente("Ana"); ana.Sueldo = 1700; ana.Dietas = 200; Direccion rosa = new Direccion("Rosa"); rosa.Sueldo = 2500; rosa.Dietas = 300; rosa.StockOptions = 100; Console.WriteLine(rosa.sueldoNeto()); Empleado[] plantilla = { eva, ana, rosa }; double total = 0; foreach(Empleado item in plantilla) { total += item.sueldoNeto(); } Console.WriteLine(total);
Herencia en c# y polimorfismo
class Persona { private string _nombre; public Persona(string nombre) { Console.WriteLine("Constructor persona " + nombre); this.Nombre = nombre; } public string Nombre { set { this._nombre = value; } get { return this._nombre; } } public virtual string saludo() { return "Hola "+Nombre+" que tal"; } } class Empleado :Persona { public Empleado(string nombre) : base(nombre) { Console.WriteLine("Constructor empleado " + nombre); this.Cargo = "Empleado"; } private string _cargo; public string Cargo { set { this._cargo = value; } get { return this._cargo; } } public override string saludo() { return "Hola empleado " + Nombre + " ¿Todo bien?"; } } class Gerente : Empleado { public int Bono { get; set; } public Gerente(string nombre) : base(nombre) { Console.WriteLine("Constructor gerente " + nombre); this.Cargo = "Gerente"; } public Gerente(string nombre, int bono) : this(nombre) { this.Bono = bono; } public override string saludo() { return "Hola Sr. " + Nombre + " ¿Desea alguna cosa?"; } } sealed class Direccion : Gerente { public Direccion(string nombre) : base(nombre, 100) { Console.WriteLine("Constructor direccion " + nombre); } public override string saludo() { return "Buenos días Sr. " + Nombre + " Estamos a sus órdenes"; } }
Ejemplo de uso:
Persona[] plantilla = { new Persona("Eva"), new Empleado("Juan"),new Empleado("Ana"), new Gerente("Rosa"), new Gerente("Luis"), new Direccion("Laura")}; foreach(Persona empleado in plantilla) { Console.WriteLine(empleado.saludo()); }
Ejercicio Producto
Vamos a definir una clase ‘Producto’ con las propiedades nombre y precio, ambas obligatorias en el constructor.
Vamos a crear una función PVP que nos devuelve el precio mas el 21% de iva.
De ahí derivamos la clase Oferta que la función PVP es la misma que en el anterior pero aplicando un 10% de descuento.
Ejercicio clases y herencia
Vamos a crear la clase Persona con las propiedades nombre (obligatoria) y DNI. Crearemos un método ‘saludo’ que nos devuelva un string con ‘Hola’+nombre
De ahí vamos a derivar la clase ‘caballero’ que tendrá la propiedad ‘tratamiento’ (obligatoria) . Sobre escribiremos el método ‘saludo’ para que devuelva ‘Hola’+tratamiento+nombre.
Añadiremos la propiedad renta de tipo int.
Vamos a derivar la clase ‘plebeyo’. Sobre escribiremos el método saludo para que devuelva ‘Hola’+nombre+’¿Qué pasa?’
Poned los getters y setters que hagan falta, pero que sea obligatorio poner un valor.
class Persona { private $nombre; private $dni; function __construct($nombre) { $this->nombre = $nombre; } function saludo() { return "Hola " . $this->nombre; } function __get($name) { return $this->$name; } function __set($name, $value) { if (empty($value)) { throw new Exception("La propiedad $name no puede estar vacía"); } $this->$name = $value; } } class Caballero extends Persona{ protected $tratamiento; protected $renta; function __construct($nombre,$tratamiento) { parent::__construct($nombre); $this->__set("tratamiento",$tratamiento); } function saludo(){ return "Hola ".$this->tratamiento." ".$this->nombre; } } class Plebeyo extends Persona{ function saludo(){ return parent::saludo()." ¿Qué pasa?"; } }