Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Herencia

Estas en el tema de Herencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Tengo esta clase: <?php class Soporte { public $titulo; protected $numero; private $precio; function __construct($tit,$num,$precio) { $this->titulo = $tit; $this->numero = $num; $this->precio = $precio; ...
  #1 (permalink)  
Antiguo 06/03/2009, 09:31
 
Fecha de Ingreso: octubre-2008
Mensajes: 4
Antigüedad: 15 años, 6 meses
Puntos: 0
Herencia

Tengo esta clase:
<?php
class Soporte
{
public $titulo;
protected $numero;
private $precio;

function __construct($tit,$num,$precio)
{
$this->titulo = $tit;
$this->numero = $num;
$this->precio = $precio;
}

public function dame_precio_sin_iva()
{ return $this->precio; }

public function dame_precio_con_iva()
{ return $this->precio * 1.16; }

public function dame_numero_identificacion()
{ return $this->numero; }

public function imprime_caracteristicas()
{
echo "<b>" . $this->titulo . "</b>";
echo "<br>" . $this->precio . " (IVA no incluido)";
echo "<br>" . "Numero: " . $this->numero;
}

}

$soporte1 = new Soporte("Los Intocables",22,3);
echo "<b>" . $soporte1->titulo . "</b>";
echo "<br>Precio: " . $soporte1->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $soporte1->dame_precio_con_iva() . " euros"."<br>";
?>

y esta otra que hereda de la anterior:

<?php
require("Soporte.php");

class Cinta_video extends Soporte
{

private $duracion;

function __construct($tit,$num,$precio,$duracion)
{
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}

public function imprime_caracteristicas()
{
echo "Película en VHS:<br>";
parent::imprime_caracteristicas();
echo "<br>Duración: " . $this->duracion;
}

}

$micinta = new Cinta_video("Los Otros", 22, 4.5, "115 minutos");
echo "<b>" . $micinta->titulo . "</b>";
echo "<br>Precio: " . $micinta->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $micinta->dame_precio_con_iva() . " euros";
?>

Cuando ejecuto la clase Cinta_video me salen los mensajes de la padre (Soporte) y ademas los de ella.
Los Intocables
Precio: 3 euros
Precio IVA incluido: 3.48 euros
Los Otros
Precio: 4.5 euros
Precio IVA incluido: 5.22 euros

Segun lo que tengo entendido deberia salirme solo los mensajes de la hija. He programado en otros lenguajes y esto no me sucedia. Por que salen los emnsajes de la clase padre (Soporte)?. Agradecere la ayuda.
  #2 (permalink)  
Antiguo 06/03/2009, 09:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Herencia

A que te refieres con los mensajes de soporte?
  #3 (permalink)  
Antiguo 12/03/2009, 14:09
Avatar de pacmanaman  
Fecha de Ingreso: marzo-2009
Mensajes: 84
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Herencia

Una acotación, los metodos nombralos tipo ...

Que la primer palabra sea una acción, verbo!

ImprimirPrecioConIVA()

en caso de que solo quieras mostrar el iva, podes usar tipo propiedades ...

public function getPrecioConIVA(){ return $this->precioConIVA;}

Para hacer mas limpio el codigo.
  #4 (permalink)  
Antiguo 12/03/2009, 14:33
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Exclamación Respuesta: Herencia

Te ocurre eso porque estas ejecutando los metodos del padre Ejemplo:

tu clase hija tiene:

Código PHP:
public function imprime_caracteristicas()
{
echo 
"Película en VHS:<br>";
parent::imprime_caracteristicas();
echo 
"<br>Duración: " $this->duracion;

El parent::imprime_caracteristicas(); te sobra, lo que haces al ponerlo es ejecutar el método de la clase padre.

No utilices parent en todos los métodos de la clase hija, sólo en el constructor.

Saludos!
  #5 (permalink)  
Antiguo 12/03/2009, 14:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Herencia

Depende, si necesitas ejecutar el código de la clase hija, es forzoso llamar a parent, si no, no se ejecutaran por ejemplo ve este:
Código php:
Ver original
  1. class myCustomDao extends Zend_Db_Table_Abstract {
  2.        public function insert( $aFields ) {
  3.                   $aFields['inserted'] = time();
  4.                   parent::insert( $aFields );
  5.        }
  6. }

Si no llamas a parent::insert() no se insertan los datos en la bdd.

Saludos
  #6 (permalink)  
Antiguo 12/03/2009, 15:00
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Respuesta: Herencia

Exacto GatorV, gracias por la correción. Todo depende de lo que ande buscando nuestro forero maelo_fredas.

Saludos!
  #7 (permalink)  
Antiguo 12/03/2009, 15:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Herencia

Por eso mismo le re-pregunte porque en teoría su clase esta bien y la esta aplicando bien, quería ver que es lo que él creia que era un error..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:07.