Foros del Web » Programando para Internet » PHP »

Ayuda con herencia multiple

Estas en el tema de Ayuda con herencia multiple en el foro de PHP en Foros del Web. Tengo 3 clases Conexion.class.php Código PHP: <?php class  Conexion {     private  $cn ;     private  $rs ;     private  $servidor ;     private  $usuario ;     private  $password ; ...
  #1 (permalink)  
Antiguo 12/06/2010, 19:31
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Exclamación Ayuda con herencia multiple

Tengo 3 clases

Conexion.class.php
Código PHP:
<?php
class Conexion
{
    private 
$cn;
    private 
$rs;
    private 
$servidor;
    private 
$usuario;
    private 
$password;
    private 
$bd;

    public function 
__construct($servidor "localhost"$usuario "root"$password =
        
"220785"$bd "sce")
    {
        
$this->servidor $servidor;
        
$this->usuario $usuario;
        
$this->password $password;
        
$this->bd $bd;
        
$this->cn = new mysqli($servidor$usuario$password$bd);
    }
    public function 
dbExecute($query)
    {
        
$this->rs $this->cn->query($query);
        return 
$this->rs;
    }
    public function 
getInsertedId()
    {
        return 
$this->cn->insert_id;
    }
    public function 
afectados()
    {
        return 
$this->cn->affected_rows;
    }
    protected function 
clean($value)
    {
        if (
get_magic_quotes_gpc()) {
            
$value stripslashes($value);
        }
        
$value mysql_real_escape_string(htmlspecialchars($value));
        return 
$value;
    }
    public function 
__destruct()
    {
        
$this->cn;
    }
}
?>
Edad.class.php
Código PHP:
<?php
class Edad
{
    private 
$fecha_nacimiento;

    public function 
__construct($fecha_nacimiento)
    {
        
$this->fecha_nacimiento $fecha_nacimiento;
    }

    private function 
dia() //Día de la fecha de nacimiento

    
{
        
$fecha explode("-"$this->fecha_nacimiento);
        
$dia $fecha[2];

        return 
$dia;
    }
    private function 
mes() //Mes de la fecha de nacimiento

    
{
        
$fecha explode("-"$this->fecha_nacimiento);
        
$mes $fecha[1];

        return 
$mes;
    }
    private function 
anio() //Año de la fecha de nacimiendo

    
{
        
$fecha explode("-"$this->fecha_nacimiento);
        
$anio $fecha[0];

        return 
$anio;
    }
    private function 
getmes() //Mes actual

    
{
        
$hoy explode("-"date("Y-m-d"));
        
$mes $hoy[1];
        return 
$mes;
    }
    private function 
getanio() //Año actual

    
{
        
$hoy explode("-"date("Y-m-d"));
        
$anio $hoy[0];
        return 
$anio;
    }
    private function 
getdia() //Día actual

    
{
        
$hoy explode("-"date("Y-m-d"));
        
$dia $hoy[2];
        return 
$dia;
    }
    private function 
calculo() //Calculo de la edad actual

    
{
        
$cumplidos $this->getanio() - $this->anio();
        return 
$cumplidos;
    }
    public function 
calcular_edad()
        
//Calculo de la edad con la codicion de que si no ha llegado a la fecha exacta de nacimiento no imprime la edad que en el año actual deberia cumplir

    
{
        
$edad $this->calculo();
        if (
$this->getmes() >= $this->mes() && $this->getdia() >= $this->dia()) { //Verifica que si el mes y dia son iguales a los de su nacimiento
            
return $edad;
        } else {
            
$edad $edad 1;
            return 
$edad;
        }
    }
    public function 
__destruct()
    {
        
$this->fecha_nacimiento;
    }
}
?>
Alumno.class.php
Código PHP:
<?php
class Alumno extends Conexion 
{
    private 
$id_alumno;
    private 
$nombre;
    private 
$app;
    private 
$apm;
    private 
$edad;
    private 
$sexo;
    private 
$fecha_nacimiento;
    private 
$estado_nacimiento;
    private 
$municipio_nacimiento;
    private 
$curp;
    private 
$colonia;
    private 
$calle;
    private 
$numero_casa;
    private 
$cp;
    private 
$estado_residencia;
    private 
$municipio_residencia;
    private 
$telefono;
    private 
$status;
    private 
$fecha_ingreso;
    private 
$imagen;
    private 
$id_tutor;
    private 
$id_grupo;
    private 
$where;

    public function 
__construct()
    {
        
parent::__construct();
        
parent::__destruct();
    }
    public function 
agregar($id_alumno$nombre$app$apm$edad$sexo$fecha_nacimiento,
        
$estado_nacimiento$municipio_nacimiento$curp$colonia$calle$numero_casa,
        
$cp$estado_residencia$municipio_residencia$telefono$status$fecha_ingreso,
        
$imagen$id_tutor$id_grupo)
    {
        
$this->id_alumno $id_alumno;
        
$this->nombre $nombre;
        
$this->app $app;
        
$this->apm $apm;
        
$this->edad $edad;
        
$this->sexo $sexo;
        
$this->fecha_nacimiento $fecha_nacimiento;
        
$this->estado_nacimiento $estado_nacimiento;
        
$this->municipio_nacimiento $municipio_nacimiento;
        
$this->curp $curp;
        
$this->colonia $colonia;
        
$this->calle $calle;
        
$this->numero_casa $numero_casa;
        
$this->cp $cp;
        
$this->estado_residencia $estado_residencia;
        
$this->municipio_residencia $municipio_residencia;
        
$this->telefono $telefono;
        
$this->status $status;
        
$this->fecha_ingreso $fecha_ingreso;
        
$this->imagen $imagen;
        
$this->id_tutor $id_tutor;
        
$this->id_grupo $id_grupo;

        
$query "INSERT INTO alumnos (id_alumno,nombre,app,apm,edad,sexo,fecha_nacimiento,estado_nacimiento,municipio_nacimiento,curp,colonia,calle,numero_casa,cp,estado_residencia,municipio_residencia,telefono,status,fecha_ingreso,imagen,id_tutor,id_grupo) VALUES ('$id_alumno','$nombre','$app','$apm','$edad','$sexo','$fecha_nacimiento','$estado_nacimiento','$municipio_nacimiento','$curp','$colonia','$calle','$numero_casa','$cp','$estado_residencia','$municipio_residencia','$telefono','$status','$fecha_ingreso','$imagen','$id_tutor','$id_grupo')";
        return 
$this->dbExecute($query);
    }
    public function 
consultar($where)
    {
        
$this->where $where;
        
$query "SELECT * FROM alumnos $where";
        return 
$this->dbExecute($query);
    }
    public function 
modificar($id_alumno$nombre$app$apm$edad$sexo$fecha_nacimiento,
        
$estado_nacimiento$municipio_nacimiento$curp$colonia$calle$numero_casa,
        
$cp$estado_residencia$municipio_residencia$telefono$status$fecha_ingreso,
        
$imagen$id_tutor$id_grupo)
    {
        
$this->id_alumno $id_alumno;
        
$this->nombre $nombre;
        
$this->app $app;
        
$this->apm $apm;
        
$this->edad $edad;
        
$this->sexo $sexo;
        
$this->fecha_nacimiento $fecha_nacimiento;
        
$this->estado_nacimiento $estado_nacimiento;
        
$this->municipio_nacimiento $municipio_nacimiento;
        
$this->curp $curp;
        
$this->colonia $colonia;
        
$this->calle $calle;
        
$this->numero_casa $numero_casa;
        
$this->cp $cp;
        
$this->estado_residencia $estado_residencia;
        
$this->municipio_residencia $municipio_residencia;
        
$this->telefono $telefono;
        
$this->status $status;
        
$this->fecha_ingreso $fecha_ingreso;
        
$this->imagen $imagen;
        
$this->id_tutor $id_tutor;
        
$this->id_grupo $id_grupo;

        
$query "UPDATE alumnos SET nombre='$nombre',app='$app',apm='$apm',edad='$edad',sexo='$sexo',fecha_nacimiento='$fecha_nacimiento',curp='$curp',colonia='$colonia',calle='$calle',numero_casa='$numero_casa',cp='$cp',estado_residencia='$estado_residencia',municipio_residencia='$municipio_residencia',telefono='$telefono',status='$status',fecha_ingreso='$fecha_ingreso',imagen='$imagen',id_tutor='$id_tutor',id_grupo='$id_grupo' WHERE id_alumno='$id_alumno'";
        return 
$this->dbExecute($query);
    }
    public function 
eliminar($id_alumno)
    {
        
$this->id_alumno $id_alumno;
        
$query "DELETE FROM alumnos WHERE id_alumno='$id_alumno'";
        return 
$this->dbExecute($query);
    }
    public function 
total($where)
    {
        
$this->where $where;
        
$query "SELECT COUNT(id_alumno) AS id_alumno FROM alumnos $where";
        return 
$this->dbExecute($query);
    }
}
?>
El problema esta en que necesito hereda las dos clases conexion y edad a la clase alumno pk necesito calcular la edad del alumno mediante su fecha de nacimiento, pero no se como puedo implementar las dos clases en la otra, habia pensado heredar edad a conexion y despues conexion a alumnos, pero el detalle esta en que no siempre voy a a utilizar los metodos de edad, sino en algunas clases por ejemplo solo en la de alumno, alguien puede ayudarme
  #2 (permalink)  
Antiguo 12/06/2010, 19:36
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Ayuda con herencia multiple

Si la clase de fecha nacimiento no tiene relación alguna con las otras clases, entonces no debes heredar. Te recomiendo que mires en este foro, ya que se ha explicado en sin número de casos cuándo debes heredar y así te da una idea más clara y te ayudará a poder realizar lo que deseas. Aún sin heredar puedes llamar dentro de una clase otra clase y el método que quieras usar.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 12/06/2010, 19:44
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Ayuda con herencia multiple

Cita:
Iniciado por abimaelrc Ver Mensaje
Si la clase de fecha nacimiento no tiene relación alguna con las otras clases, entonces no debes heredar. Te recomiendo que mires en este foro, ya que se ha explicado en sin número de casos cuándo debes heredar y así te da una idea más clara y te ayudará a poder realizar lo que deseas. Aún sin heredar puedes llamar dentro de una clase otra clase y el método que quieras usar.
Fijate que cuando voy a dar de alta a un alumno lo hago de la siguiente manera

Código PHP:
<?php
include("../../clases/Cargar_clases.php");
$id_alumno=$_POST["id_alumno"];
$nombre=$_POST["nombre"];
$app=$_POST["app"];
$apm=$_POST["apm"];
$fecha_nacimiento=$_POST["fecha_nacimiento"];
$sexo=$_POST["sexo"];
$curp=$_POST["curp"];
$fecha_ingreso=$_POST["fecha_ingreso"];
$estado_nacimiento=$_POST["estado_nacimiento"];
$municipio_nacimiento=$_POST["municipio_nacimiento"];
$estado_residencia=$_POST["estado_residencia"];
$municipio_residencia=$_POST["municipio_residencia"];
$colonia=$_POST["colonia"];
$calle=$_POST["calle"];
$numero_casa=$_POST["numero_casa"];
$cp=$_POST["cp"];
$telefono=$_POST["telefono"];
$id_grupo=$_POST["id_grupo"];
$id_tutor=$_POST["id_tutor"];
$tmp_foto $_FILES["imagen"]["tmp_name"];
$imagen=$id_alumno.".png";
$calculoEdad=new Edad($fecha_nacimiento);
$imgTrans = new ImageTransform();
$alumno=new Alumno();

$edad=$calculoEdad->calcular_edad();
    
$imgTrans->sourceFile $tmp_foto;
    
$imgTrans->targetFile $imagen;
    
$imgTrans->resizeToWidth 100;
    
$imgTrans->resize();
    
$imgTrans->targetFile;

copy($imagen"../../imagenes/alumnos/" $imagen);        
$alumno->agregar($id_alumno,$nombre,$app,$apm,$edad,$sexo,$fecha_nacimiento,$estado_nacimiento,$municipio_nacimiento,$curp,$colonia,$calle,$numero_casa,$cp,$estado_residencia,$municipio_residencia,$telefono,1,$fecha_ingreso,$imagen,$id_tutor,$id_grupo);
unlink($imagen);
header("Location: alta.php");
?>
la operacion de agregar la hace correctamente y hace todo lo que deberia de hacer, pero el detalle esta cuando calculo la edad, es correcto utilizarlo asi como lo tengo o hay algun problema
  #4 (permalink)  
Antiguo 12/06/2010, 19:48
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Ayuda con herencia multiple

Lo mejor es que hagas un var_dump a las variables involucradas en el problema para que veas su comportamiento. Así te haces de una idea que es lo que está pasando. Toda variable que trabaje con el calculo de edad te recomiendo que le hagas un var_dump.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 13/06/2010, 12:27
Avatar de shaggyz  
Fecha de Ingreso: mayo-2008
Mensajes: 43
Antigüedad: 15 años, 11 meses
Puntos: 3
Respuesta: Ayuda con herencia multiple

No se si es lo que necesitas, pero tambien podrias utilizar una clase estática, para que realize operaciones tan simples como lo es el calculo de edad:

Código PHP:
$edad AlumnoHelper::calcularEdad($fechaNacimiento); 
De hecho en esa clase podrías definir todo tipo de métodos similares y no necesitarías instanciarla, de esta manera el sector de inserción de datos de tu aplicación (muy importante) quedaría mas despejado, ya que se ve que asumes que siempre te llegarán datos por el post y no siempre puede ser así y la aplicación petaría.


Saludos.
  #6 (permalink)  
Antiguo 14/06/2010, 07:24
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: Ayuda con herencia multiple

Tienes los conceptos de "herencia" realmente tergiversados, no debes de heredar por heredar (reutilizar código) debe de existir una relación de dependencia :s

Que funcione no quiere decir que este bien hecho lo que estas pseudo tratando de hacer con objetos.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #7 (permalink)  
Antiguo 15/06/2010, 19:51
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
Respuesta: Ayuda con herencia multiple

Que tal Negro1985

Te recomiendo la lectura de dos artículos que escribí particularmete para responder tus dos temas, la herencia múltiple y la "herencia mecánica"

Saludos!
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 15/06/2010, 23:24
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda con herencia multiple

Hola Negro1985

Existe un Patrón de Diseño Decorator que soluciona el tema de la herencia múltiple, pero sin los problemas derivados que el uso de la misma conlleva que son las colisiones de nombre y las herencias repetidas.

En este artículo hice alusión al tema. Te recomiendo que le des lectura y así empieces a conocer sobre patrones.

http://desarrolladorsenior.blogspot.com/2009/09/patron-de-diseno-decorator-en-php5.html

Saludos

Última edición por atrianaster; 15/06/2010 a las 23:31
  #9 (permalink)  
Antiguo 16/06/2010, 08:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Ayuda con herencia multiple

@atrianaster, creo que el patron Decorator no sirve en nada para lo que esta pasando aqui, y lo que el usuario requiere, ya que su uso es otro totalmente.

El patron decorator NO solventa la herencia multiple, ni fue creado para eso, te recomiendo tu mismo leas el articulo que pusiste y lo entiendas bien.

Saludos.
  #10 (permalink)  
Antiguo 16/06/2010, 09:14
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 10 meses
Puntos: 32
Respuesta: Ayuda con herencia multiple

Estimado Atrianaster,

Tu aporte está completamente equivocado, particularmente esto sucede por tener la costumbre de copia y pegar contenidos que no son propios y no entender lo que se copia.

Los términos que haces referencia los sacas (nuevamente) de mi blog, y estás constantemente pendiente donde escribo para hacer un comentario detrás mio, no sé, pensarás que con eso atraerás más visitas.

Lamentable.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por GatorV; 17/06/2010 a las 09:26
  #11 (permalink)  
Antiguo 17/06/2010, 00:00
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda con herencia multiple

@GatorV

El patrón Decorator no se creo para solventar la herencia múltiple, pero si para cuando la extensión mediante la herencia simple no es viable por algún motivo. Con el uso de este patrón se puede “simular” la herencia múltiple mediante la asociación de clases. Es de suponer que mi propio articulo lo entiendo muy bien.

Saludos
  #12 (permalink)  
Antiguo 17/06/2010, 09:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Ayuda con herencia multiple

@atrianaster

No, perdon pero te pido investigues para que es y como sirve el patrón decorator, fue creado para solventar algo simple: Agregar funcionalidad a una clase de forma dinamica.

No es solventar ni hacer herencia múltiple ni nada, aparte de que el problema en el caso de negro1985 es que no debe de heredar por heredar, es un problema a nivel conceptual de cuando y como debe de heredar una clase, si lo confundes diciendo que usando el patrón Decorator puede solventar y hacer lo que quiere hacer, le estas mostrando un concepto erroneo de como diseñar su clase.

Aparte que por lo que te comentaba, el patron decorador tiene otro uso que es el de agregarle funcionalidad a la clase, no heredar de muchas clases.

@atrianaster y @enriqueplace.
Por favor dejen sus problemas personales fuera del foro.

Saludos.
  #13 (permalink)  
Antiguo 24/06/2010, 12:53
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda con herencia multiple

Cita:
Iniciado por GatorV Ver Mensaje
@atrianaster

No, perdon pero te pido investigues para que es y como sirve el patrón decorator, fue creado para solventar algo simple: Agregar funcionalidad a una clase de forma dinamica.
Correcto. Utilizando este patrón podemos añadir características o funcionalidades de objetos existentes sin necesidad de utilizar la herencia.

Cita:
Iniciado por GatorV Ver Mensaje
No es solventar ni hacer herencia múltiple ni nada,
Nunca dije "que era" para solventar la herencia múltiple.

Cita:
Iniciado por GatorV Ver Mensaje
aparte de que el problema en el caso de negro1985 es que no debe de heredar por heredar, es un problema a nivel conceptual de cuando y como debe de heredar una clase, si lo confundes diciendo que usando el patrón Decorator puede solventar y hacer lo que quiere hacer, le estas mostrando un concepto erroneo de como diseñar su clase.
Si @negro1985 no debe heredar por heredar por un problema conceptual, que uno de ellos puede ser la inexistencia de la relación de parentesco entre la clase padre y la clase hija. Entonces puede hacer uso del Patrón Decorator ya que se recomienda su aplicabilidad cuando, la extensión mediante la herencia no es viable o cuando hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para extenderlo a través de la herencia.

Cita:
Iniciado por GatorV Ver Mensaje
Aparte que por lo que te comentaba, el patron decorador tiene otro uso que es el de agregarle funcionalidad a la clase, no heredar de muchas clases.
Que si utilizamos esta característica inteligentemente con el uso de Interfaces podemos lograr algo similar.

En el código de ejemplo siguiente se evidencia claramente como un Ambidiestro puede escribir con ambas manos y es utilizando este patrón. Ambidiestro hereda de Diestro e implementa la interfaz IZurdo.


Código PHP:
Ver original
  1. interface IZurdo
  2. {
  3.     public function escribeConLaIzquierda();
  4. }
  5.  
  6. interface IDiestro
  7. {
  8.     public function escribeConLaDerecha();
  9. }
  10.  
  11. class Diestro implements IDiestro
  12. {
  13.   public function escribeConLaDerecha()
  14.   {
  15.       return 'Soy un Diestro';
  16.   }
  17. }
  18.  
  19. class Zurdo implements IZurdo
  20. {
  21.    public function escribeConLaIzquierda()
  22.    {
  23.        return 'Soy un Zurdo';
  24.    }
  25. }
  26.  
  27. class AmbiDiestro extends Diestro implements IZurdo
  28. {
  29.    public function escribeConLaIzquierda()
  30.    {
  31.       $zurdo = new Zurdo();
  32.       return $zurdo->escribeConLaIzquierda();
  33.    }
  34. }
  35.  
  36. $ambidiestro = new AmbiDiestro();
  37. echo $ambidiestro->escribeConLaDerecha();
  38. echo $ambidiestro->escribeConLaIzquierda();


Saludos decorados

Última edición por atrianaster; 24/06/2010 a las 13:34
  #14 (permalink)  
Antiguo 24/06/2010, 14:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Ayuda con herencia multiple

Pero no solventa en nada el problema de @negro1985, ya que como bien comentaron todos en el tema, solamente tiene que separar esa funcionalidad en otra clase e instanciarla dentro de su clase para utilizarla, no hay necesidad de usar el patrón decorator, ni nada, es simplemente instanciar la clase dentro y utilizarla.

Tu solución que expones no usa tampoco el patrón decorator, ya que si bien lees, la idea del patrón decorator es que el objeto decorado funcione con o sin el decorador, un ejemplo claro:
Código PHP:
Ver original
  1. <?php
  2. interface iCoffee
  3. {
  4.     public function getBaseCost();
  5. }
  6.  
  7. class Coffee implements iCoffee
  8. {
  9.     protected $_baseCost = 0;
  10.    
  11.     public function getBaseCost()
  12.     {
  13.         return $this->_baseCost;
  14.     }
  15. }
  16.  
  17. class BlackCoffee extends Coffee
  18. {
  19.     public function __construct()
  20.     {
  21.         $this->_baseCost = 5;
  22.     }
  23. }
  24.  
  25. abstract class CoffeeDecorator implements iCoffee
  26. {
  27.     protected $_coffee;
  28.    
  29.     public function __construct(iCoffee $Coffee)
  30.     {
  31.         $this->_coffee = $Coffee;
  32.     }
  33. }
  34.  
  35. class WithCream extends CoffeeDecorator
  36. {
  37.     public function getBaseCost()
  38.     {
  39.         return $this->_coffee->getBaseCost() + 1.5;
  40.     }
  41. }
  42.  
  43. class WithMilk extends CoffeeDecorator
  44. {
  45.     public function getBaseCost()
  46.     {
  47.         return $this->_coffee->getBaseCost() + 4;
  48.     }
  49. }
  50.  
  51. class WithChocolate extends CoffeeDecorator
  52. {
  53.     public function getBaseCost()
  54.     {
  55.         return $this->_coffee->getBaseCost() + 5;
  56.     }
  57. }
  58.  
  59. $coffee = new WithChocolate(new WithMilk(new WithCream(new BlackCoffee())));
  60. echo 'El precio del cafe es: $' . $coffee->getBaseCost();

Tu ejemplo no tiene nada de eso, por eso mi referencia a que leyeras y estudiaras realmente para que sirve cada patrón y cual es el problema en específico que requiere .

Saludos.

Última edición por GatorV; 24/06/2010 a las 16:14 Razón: ajustando ejemplo
  #15 (permalink)  
Antiguo 24/06/2010, 15:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Ayuda con herencia multiple

@GatorV a ver si entendí. En el ejemplo que indicaste CoffeeDecorator es como una clase abstracta. De ella se heredan las demás clases que se usarán para algún detalle adicional. ¿De esa forma es que funciona el patrón decorator? Aunque la misma palabra dice que es algo como de decoración. Leí un poco y los ejemplos que ví, como en el caso de wikipedia hace similar a lo que te estoy indicando ¿o se me escapa algo?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #16 (permalink)  
Antiguo 24/06/2010, 16:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Ayuda con herencia multiple

Así es, la idea del decorador es que decore, o ajuste las propiedades de una clase base, no es brindar funcionalidad, la idea es no tocar la clase base, si no ajustarla de forma dinámica, y poder ajustar 1 o 0 decoradores que cambien y afecten la clase como tal.

Es por eso que lo que es Decorator NO sirve para la herencia múltiple, ni se acerca a solventar ese problema ya que actua sobre un mismo método.

Otro ejemplo que una vez leía es un juego, supongamos tenemos nuestro jugador base, pero como todos sabemos en varios juegos RPG podemos comprar items, que afectan las características de nuestro jugador. En esto el decorator sirve perfectamente ya que podemos ajustar propiedades dependiendo de los items que tiene el jugador sin tener que crear una nueva clase o tipo de jugador por cada item.

Saludos.
  #17 (permalink)  
Antiguo 24/06/2010, 16:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Ayuda con herencia multiple

Gracias, me imagine que era algo así. Con lo del juego, lo entendí completamente. Bueno al menos el tema sirvió para aprender algo nuevo (bueno para mí, en este caso).
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #18 (permalink)  
Antiguo 03/07/2010, 08:12
 
Fecha de Ingreso: julio-2010
Mensajes: 2
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con herencia multiple

Estoy aprendiendo mucho
_________________
http://esohavuelto.blogspot.com/
  #19 (permalink)  
Antiguo 10/08/2010, 16:03
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda con herencia multiple

Cita:
Iniciado por GatorV Ver Mensaje
Pero no solventa en nada el problema de @negro1985, ya que como bien comentaron todos en el tema, solamente tiene que separar esa funcionalidad en otra clase e instanciarla dentro de su clase para utilizarla, no hay necesidad de usar el patrón decorator, ni nada, es simplemente instanciar la clase dentro y utilizarla.
La solución que expuse hace algo similar.

Cita:
Iniciado por GatorV Ver Mensaje
Tu solución que expones no usa tampoco el patrón decorator, ya que si bien lees, la idea del patrón decorator es que el objeto decorado funcione con o sin el decorador, un ejemplo claro:
Si tienes razón, aunque lo adecue a las necesidades de @negro1985.

Otro ejemplo de un objeto decorador:
Código PHP:
Ver original
  1. <?php
  2.  
  3.    require_once("abstract_widget.php");
  4.  
  5.    class BorderDecorator extends Widget {
  6.  
  7.      private $widget;
  8.  
  9.      function __construct(Widget $widget) {
  10.             $this->widget = $widget;
  11.      }
  12.  
  13.      public function draw() {
  14.  
  15.             $this->widget->update($this->getSubject());
  16.             echo "<table border=0 cellpadding=1 bgcolor=#3366ff>";
  17.             echo "<tr bgcolor=#ffffff><td>";
  18.             $this->widget->draw();
  19.             echo "</td></tr></table>";
  20.        }
  21.    }
  22.    ?>

Saludos.

Última edición por atrianaster; 10/08/2010 a las 16:08
  #20 (permalink)  
Antiguo 10/08/2010, 16:17
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda con herencia multiple

Cita:
Iniciado por abimaelrc Ver Mensaje
@GatorV a ver si entendí. En el ejemplo que indicaste CoffeeDecorator es como una clase abstracta. De ella se heredan las demás clases que se usarán para algún detalle adicional. ¿De esa forma es que funciona el patrón decorator? Aunque la misma palabra dice que es algo como de decoración. Leí un poco y los ejemplos que ví, como en el caso de hace similar a lo que te estoy indicando ¿o se me escapa algo?
@abimaelrc si la misma palabra decorator aveces tiende a confundir y pensar que se trata solamente de un tema de diseño, aunque no necesariamente.

Saludos.

Última edición por atrianaster; 10/08/2010 a las 16:25

Etiquetas: herencia
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 03:54.