Foros del Web » Programando para Internet » PHP »

¿Cómo heredar de dos clases?

Estas en el tema de ¿Cómo heredar de dos clases? en el foro de PHP en Foros del Web. Buenos días. Os presento el caso y la solución a la que he llegado, a ver que os parece y si existe alguna solucción mejor. ...
  #1 (permalink)  
Antiguo 07/11/2015, 09:19
 
Fecha de Ingreso: agosto-2006
Mensajes: 219
Antigüedad: 17 años, 8 meses
Puntos: 0
¿Cómo heredar de dos clases?

Buenos días.

Os presento el caso y la solución a la que he llegado, a ver que os parece y si existe alguna solucción mejor.
  • Tengo una clase coche.
  • Tengo otra clase llamada coche_gasolina, que extiende coche.
  • Tengo otra clase llamada coche_electrico, que extiende coche.
  • Y tengo una clase llamada coche_hibrido.

Lo ideal sería que coche_hibrido pudiese extender tanto coche_gasolina como coche_electrico, tanto su métodos como sus atributos.

No vía una forma clara de hacer esto en php, y se me ha ocurrido crear traits que son los que definen los métodos tanto de coche_electrico como de coche_gasolina y así poder usarlos también en coche_hibrido.

¿Os parece una buena solución o pensáis que podría haber mejores formas de hacerlo?

Gracias.

Oskar
  #2 (permalink)  
Antiguo 07/11/2015, 09:28
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: ¿Cómo heredar de dos clases?

Saludo
Pues es una buena solución, pero obviamente dependerá
de la versión de php que se maneje donde se quiera implementar.

Otra solución podría ser que en vez de heredar, se implementen
funcionalidades, podría ser incluso haciendo uso de interfaces.

Y otra podría ser dejar los tipos de combustibles como parte
del coche genérico, y más bien que los tres (gasolina, eléctrico e híbrido)
hereden del genérico solo lo que necesiten, y ya cada cual tendrá
las propiedades y métodos necesarios, y pueden sobreescribir
los heredados, o tener otros.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 07/11/2015, 09:51
 
Fecha de Ingreso: agosto-2006
Mensajes: 219
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: ¿Cómo heredar de dos clases?

Tienes razón en que los traits solo se pueden usar a partir de la versió 5.4.

Pero me preocupa que con interfaces defines los métodos y luego los desarrollas en las clases, el problema es que luego tienes que tener mucho cuidado con el mantenimiento de actualizar en todas las clases, con los traits por el contrario tienes el código "centralizado", y todas las clases lo invocan.

Respecto a la definición de las clases, si podría darle más vueltas, pero meter tantos métodos a la clase coche me da la sensación que la sobrecargo con métodos/atributos que un "coche" en abstracto no tiene, y si lo tiene cuando piensas en un coche eléctrico o de gasolina.

Gracias.

Oskar
  #4 (permalink)  
Antiguo 08/11/2015, 13:15
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: ¿Cómo heredar de dos clases?

Cita:
No vía una forma clara de hacer esto en php, y se me ha ocurrido crear traits que son los que definen los métodos tanto de coche_electrico como de coche_gasolina y así poder usarlos también en coche_hibrido.

¿Os parece una buena solución o pensáis que podría haber mejores formas de hacerlo?
Tu problema no es de php, es de análisis y diseño. Es sencillo evadir la herencia múltiple si cambias la perspectiva del problema, en tu caso si analizas un poco todos los carros con independencia del motor hacen las mismas cosas (encender, avanzar, girar, apagar, etc..) además de tener un motor entre otras cosas; en tu problema solo usas de forma general dos tipos de motores (Eléctrico y de Combustión) ya que un auto híbrido usa los dos motores y esto es lo que diferencia a un auto eléctrico de uno de combustión o híbrido, Así que puedes "clasificar el motor" en lugar del auto, de esa forma solo variara el motor que debe de usar y esta parte se puede implementar con interfaces, herencia simple, clases abstractas o traits, de esta forma no requieres herencia múltiple.

Cita:
Tienes razón en que los traits solo se pueden usar a partir de la versió 5.4.
Esto ya no debe de ser un problema ya que las versiones 5.3, 5.4 e inclusive la versión 5.5 ya terminaron su ciclo de vida, por lo cual no debes de tener software funcionando con esas versiones:
http://php.net/supported-versions.php
Cita:
Pero me preocupa que con interfaces defines los métodos y luego los desarrollas en las clases, el problema es que luego tienes que tener mucho cuidado con el mantenimiento de actualizar en todas las clases
Esto es completamente erroneo debes de escribir código que no dependa de clases concretas y para eso requieres usar interfaces y clases abstractas. Las aplicaciones con clases concretas son muchos mas difíciles de mantener y extender. El problema que mencionas no tiene nada que ver con el uso de las Interfaces; eso sucede cuando fragmentas de mas el comportamiento que debiera estar manejando una sola clase.
Cita:
con los traits por el contrario tienes el código "centralizado", y todas las clases lo invocan.
Es cierto, pero aqui si debes de tener cuidado ya que un cambio en el trait impacta en todas las clases que lo usan, además si quieres agregar cambios en el comportamiento en una sola clase, esta clase tiene que sobre escribir el Trait y si es se replica a otras clases comienzas a tener problemas de mantenimiento.
Por otro lado puedes utilizar Interfaces y Traits de forma conjunta.
Cita:
Respecto a la definición de las clases, si podría darle más vueltas, pero meter tantos métodos a la clase coche me da la sensación que la sobrecargo con métodos/atributos que un "coche" en abstracto no tiene, y si lo tiene cuando piensas en un coche eléctrico o de gasolina.
Si haces uso de la composición y los principios SOLID y GRASP (Principio de Diseño Orientado a Objetos ) esto no debe de suceder.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: clases, poo
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 19:10.