Código tienda
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.