Ver Mensaje Individual
  #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, 10 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.