<?php

// *********************************************************************
// 
//  Clase PedidoConDescuento
//
//  Taller de Programación Orientada a Objetos
//  para programadores de PHP
//
//  http://www.linuxcabal.org
//
//  Autor: Jerónimo Sánchez <jsanchez@consecutio.com>
// 

class PedidoConDescuento extends Pedido {

    // por el hecho de extender Pedido, la clase PedidoConDescuento
    // hereda todas sus variables miembro y métodos public y protected
    // (recuerda: private = protected, salvo que no se hereda.)
    
    // es como si hubiéramos definido todo esto:
    
    //  public $cliente = null;         
    //  public $productos = array();    
    //  public function anyadirProducto (Producto $p) {...}
    //  protected function calcularTotal () {...}
    //  public function imprimir () {...}

    
    // ---------------------------------------------------------------------
    
    // atributos = variables miembro
    
    // a las variables miembro $cliente y $productos añadimos una nueva
    // variable miembro para guardar el descuento del pedido:
    
    protected $descuento = 0.0;     // descuento: FLOAT(3,2)
    
    // ---------------------------------------------------------------------
    
    // constructor

    // dado que Pedido inicializa cosas, tenemos que crear un constructor
    // que, al menos, llame al constructor de Pedido (nuestra clase "madre").
    // obviamente, la lista de parámetros debe coincidir, ya que 
    // PedidoConDescuento no deja de ser también un Pedido, es decir.
    
    public function __construct (Cliente $cliente) {
        parent::__construct($cliente);
    }

    // ---------------------------------------------------------------------

    // métodos "getter" y "setter"
    
    // necesitaremos un "getter" y un "setter" para la nueva variable
    // miembro $descuento:
    
    public function obtenerDescuento () {
        return $this->descuento;
    }
    
    public function ponerDescuento ($d) {
        // no tiene sentido poner descuentos menores
        // que 0 ni mayores que 100, así que validamos el
        // parámetro $d antes de guardarlo:
        if ((is_float($d) || is_int($d)) && 
                ($d >= 0.0 && $d <= 100.00)) {
            $this->descuento = $d;
        }
    }

    // ---------------------------------------------------------------------

    // otros métodos...
    
    // por último, para conseguir la funcionalidad extra (soporte para
    // descuentos), redefinimos el método calcularTotal() de Pedido.
    
    // ya hemos reutilizado código mediante la herencia. ahora 
    // vamos a reutilizar código llamando a la versión de 
    // calcularTotal() de Pedido. llamando a la versión de Pedido nos
    // ahorramos duplicar el algoritmo para sumar el precio de
    // los productos. lo único que tenemos que hacer es aplicar el
    // descuento correspondiente al resultado.
    
    // esto tiene la ventaja adicional de que, si en un futuro cambia el
    // algoritmo para calcular el total, sólo hay que modificarlo en
    // un lugar de la aplicación: la versión calcularTotal() de Pedido.
    
    public function calcularTotal () {
        return parent::calcularTotal() * 
            (1 - $this->obtenerDescuento());
    }
    
}

?>
