Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Diferencia entre clase Abstracta y interfaz

Estas en el tema de Diferencia entre clase Abstracta y interfaz en el foro de PHP en Foros del Web. Hola, quería saber cual es la diferencia entre una clase abstracta y una interfaz Por ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original abstract class crud ...
  #1 (permalink)  
Antiguo 06/09/2014, 20:25
Avatar de juan_14nob  
Fecha de Ingreso: abril-2010
Mensajes: 552
Antigüedad: 14 años
Puntos: 6
Diferencia entre clase Abstracta y interfaz

Hola, quería saber cual es la diferencia entre una clase abstracta y una interfaz

Por ejemplo:

Código PHP:
Ver original
  1. abstract class crud {
  2.     abstract public function add();
  3.     abstract public function edit();
  4.     abstract public function update();
  5.     abstract public function delete();
  6. }
  7.  
  8. interface crud {
  9.     public function add();
  10.     public function edit();
  11.     public function update();
  12.     public function delete();
  13. }


¿Herede o Implemente va a ser lo mismo?
Me confunde un poco. Me gustaría que alguien me diga cuando usar una y cuando la otra.

Saludos!
  #2 (permalink)  
Antiguo 06/09/2014, 23:52
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: Diferencia entre clase Abstracta y interfaz

Hola,

Las interfaces son contratos que tienes que implementar, es decir, no hacen nada, no tienen funcionalidad alguna, pero debes "firmar" si quieres utilizaros, y no trabajan en el contexto de una clase.

Las clases abstractas cómo bien dice su nombre, son clases y por ende puedes definir un comportamiento, una lógica etcétera. Así pues tu puedes utilizar la clase abstacta pero también debes implementar cada uno de los métodos que definas como tal.

Aquí te dejo un ejemplo de clase abstracta, saludos.

http://uno-de-piera.com/clases-abstr...emplo-de-crud/
__________________
Puedes visitarme en uno-de-piera
  #3 (permalink)  
Antiguo 07/09/2014, 08:45
Avatar de juan_14nob  
Fecha de Ingreso: abril-2010
Mensajes: 552
Antigüedad: 14 años
Puntos: 6
Respuesta: Diferencia entre clase Abstracta y interfaz

Cita:
Iniciado por israel965 Ver Mensaje
Hola,

Las interfaces son contratos que tienes que implementar, es decir, no hacen nada, no tienen funcionalidad alguna, pero debes "firmar" si quieres utilizaros, y no trabajan en el contexto de una clase.

Las clases abstractas cómo bien dice su nombre, son clases y por ende puedes definir un comportamiento, una lógica etcétera. Así pues tu puedes utilizar la clase abstacta pero también debes implementar cada uno de los métodos que definas como tal.

Aquí te dejo un ejemplo de clase abstracta, saludos.

http://uno-de-piera.com/clases-abstr...emplo-de-crud/

Me gustó pero aún sigo sin entender cuando usar uno y cuando el otro.

Saludos!
__________________
El castellano es un idioma hermoso, por favor no lo alteres, no lo modifiques, escribe correctamente.
  #4 (permalink)  
Antiguo 07/09/2014, 10:18
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: Diferencia entre clase Abstracta y interfaz

Cómo puedes ver en el ejemplo, una clase abstracta es un objeto y tiene o puede tener funcionalidad de base, una conexión con base de datos, consultas etcétera.

Si necesitas utilizar ese código en más lugares es útil la clase abstracta porque además de obligar a implementar determinados métodos ofrecerás funcionalidades sin tener que reescribirlas cada vez.

En su lugar, la interfaz no sirve para nada más que para obligar a firmar ese código para que pueda ser utilizado.

Creo que está bastante claro, sólo necesitas verte en el caso para que sepas cuál es la mejor opción.
__________________
Puedes visitarme en uno-de-piera
  #5 (permalink)  
Antiguo 07/09/2014, 19:20
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: Diferencia entre clase Abstracta y interfaz

Cuando usar una interfaz, una clase abstracta o ambas es cosa de conceptos que generalmente no obtienes cuando aprendes POO mediante un lenguaje.
Te voy a dejar un articulo que te puede ayudar con el concepto: http://thinkingoo.wordpress.com/2014...s-la-interfaz/
Si entiendes el concepto de interfaz sera sencillo el de clase abstracta. Ya no tengo tiempo el día de hoy, pero si aún tienes dudas comenta y agrego un ejemplo.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 08/09/2014, 18:32
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: Diferencia entre clase Abstracta y interfaz

Ya con un poco mas de tiempo he decidido ampliar un poco este hilo para aclarar la duda de juan14_nob y que considero es una duda común.

Cita:
¿Herede o Implemente va a ser lo mismo?
No, no es lo mismo las interfaces y las clases abstractas son conceptos diferentes

Cita:
Una interfaz es la descripción de las acciones que puede realizar un objeto
Cita:
Una clase abstracta es aquella cuyo propósito principal es definir una interfaz común para sus subclases.
La interfaz describe un objeto desde afuera o si lo prefieres su abstracción es decir; una interfaz (abstracción de un objeto) te dice lo que puede hacer un objeto sin conocer su detalles internos.
Para fines prácticos esto quieres decirr que cuando modelo un objeto en PHP puedo declarar la abstracción mediante la interfaz y además su comportamiento interno mediante una clase.
En otras palabras un objeto en un lenguaje puede ser definido de la siguiente forma

Cita:
Objeto = interfaz (abtracción) + su clase (implementación)
Las clases abstractas es el equivalente de una interfaz pero para una jerarquía de objetos, como es la abstracción del comportamiento de una jerarquía no se pueden instanciar directamente. Un ejemplo del mundo real lo puedes apreciar en los smartphone todos comparte características y funcionalidad similares, pero cuando usas uno no tienes un objeto smartphone, si no mas bien un objeto concreto del tipo smart phone (Samsung GT-E1205, LG D950-G Flex, etc.)

Ahora vamos a traducir todo esto a un ejemplo en PHP, para esto voy a usar una definición de reloj y vamos a modelarlo de forma muy sencilla para centrarnos en los conceptos que mencione antes.

Cita:
Reloj (objeto) : Instrumento para medir el tiempo o para indicar la hora del día (lo que hace); puede ser fijo o portátil y el más común para indicar la hora consiste en una maquinaria de movimientos uniformes que hace avanzar unas manecillas sobre una superficie esférica, marcando el paso del tiempo.
De la definición se puede determinar que la razón de ser de un reloj es proporcionarme la hora del día. Claro esta que también conocemos por experiencia que puede proporcionarnos la fecha actual entre otras cosas. Pero como lo comente vamos a dejarlo sencillo, así que podemos representar la abstracción de un reloj de la siguiente forma en php.

Código PHP:
Ver original
  1. interface Reloj
  2. {
  3.     public function hora();
  4. }
Con la interfaz estoy declarando las posibles variantes que puede tener un objeto Reloj y lo útil de esto es que puedo usar la interfaz antes de haber escrito siquiera una clase concreta de reloj. Para esto crearemos una persona que pueda usar un reloj de cualquier tipo.
Código PHP:
Ver original
  1. class Persona {
  2.     private $reloj;
  3.  
  4.     public function usar(Reloj $reloj){
  5.         $this->reloj = $reloj;
  6.  
  7.         return $this;
  8.     }
  9.  
  10.     public function verLaHora(){
  11.         return 'Reloj: '.get_class($this->reloj).' Hora: '.$this->reloj->hora();
  12.     }
  13. }

Para probar la utilidad de la interfaz voy a crear diferentes relojes que me proporcionen la hora y la fecha en diferentes formatos.

  • Formato de 12 horas
  • Formato de 12 horas y fecha
  • Formato de 12 o 24 horas
  • Formato configurable de 12 o 24 horas y formato de fecha configurable
Código PHP:
Ver original
  1. class RelojDePared implements Reloj{
  2.  
  3.     // formato de 12 horas
  4.     public function hora()
  5.     {
  6.         return date('h:i:s a');
  7.     }
  8. }
  9.  
  10. class RelojPuslsoClasico implements Reloj {
  11.  
  12.     private $dateTime;
  13.  
  14.     public function __construct()
  15.     {
  16.         $this->dateTime = new DateTime();
  17.     }
  18.  
  19.     //formato de 12 horas y fecha del día
  20.     public function hora()
  21.     {
  22.         return $this->dateTime->format('h:i:s A, d M y');
  23.     }
  24. }
  25.  
  26. class RelojPulsoDigital implements Reloj {
  27.     private $dateTime;
  28.  
  29.     private $formato = [
  30.         12 => 'h:i:s a',
  31.         24 => 'H:i:s'
  32.     ];
  33.  
  34.     private $formatoHora;
  35.  
  36.     public function __construct($formatoHora = 12)
  37.     {
  38.         $this->dateTime = new DateTime();
  39.         $this->formatoHora = $formatoHora;
  40.     }
  41.  
  42.     //formato de 12 o 24 horas
  43.     public function hora()
  44.     {
  45.         return $this->dateTime->format($this->formato[$this->formatoHora]);
  46.     }
  47. }
  48.  
  49. class RelojDigitalConCalendario implements Reloj{
  50.  
  51.     private $dateTime;
  52.  
  53.     private $formatoHora;
  54.  
  55.     private $formatoFecha;
  56.  
  57.     public function __construct($formatoHora = 'h:i:s a', $formatoFecha = 'Y-m-d')
  58.     {
  59.         $this->dateTime = new DateTime();
  60.         $this->formatoHora = $formatoHora;
  61.         $this->formatoFecha = $formatoFecha;
  62.     }
  63.  
  64.     // formato de 12 o 24 hrs y fecha del día
  65.     public function hora()
  66.     {
  67.         return $this->dateTime->format(
  68.             sprintf('%s %s', $this->formatoHora, $this->formatoFecha)
  69.         );
  70.     }
  71. }


Creamos instancias de cada reloj y probamos que las use Persona:

Código PHP:
Ver original
  1. $relojPared = new RelojDePared();
  2. $relojClasico = new RelojPuslsoClasico();
  3. $relojDigital = new RelojPulsoDigital();
  4. $relojDigital24 = new RelojPulsoDigital(24);
  5. $relojDigitalConCalendario = new RelojDigitalConCalendario();
  6. $mejorReloj = new MejoraRelojDigital();
  7.  
  8.  
  9. $persona = new Persona();
  10. echo $persona->usar($relojPared)->verLaHora() .'<br>';
  11. echo $persona->usar($relojClasico)->verLaHora() .'<br>';
  12. echo $persona->usar($relojDigital24)->verLaHora() .'<br>';
  13. echo $persona->usar($relojDigital)->verLaHora() .'<br>';
  14. echo $persona->usar($relojDigitalConCalendario)->verLaHora() .'<br>';


Si te das cuenta todas las clases hace su trabajo interno de forma diferente pero como están implementando la interfaz Reloj esto no marcara diferencia alguna para el objeto persona que puede usar cualquiera de los relojes que implementamos.

Hasta aquí espero que ya este claro el concepto de interfaz. Para tratar el tema de clase abstracta vamos a emplear lo que ya tenemos echo.
Si te das cuenta algunos de las implementaciones de los relojes comparten casi el mismo código lo único diferente es el formato que entregan.

Si seguimos agregando implementaciones puede llegar un punto en el que tengamos varias clases repitiendo el mismo código así que puedes agruparlo y no estarlo repitiendo. Así que crearemos una clase abstracta que contenga ese código que puede extenderse para implementar nuevos relojes.
Código PHP:
Ver original
  1. abstract class AbstractReloj implements Reloj {
  2.  
  3.     protected  $dateTime;
  4.  
  5.     protected  $formatoHora;
  6.  
  7.     protected  $formatoFecha;
  8.  
  9.     public function __construct($formatoHora = 'h:i:s a', $formatoFecha = 'Y-m-d')
  10.     {
  11.         $this->dateTime = new DateTime();
  12.         $this->formatoHora = $formatoHora;
  13.         $this->formatoFecha = $formatoFecha;
  14.     }
  15.     public function hora()
  16.     {
  17.       return $this->dateTime->format($this->formato());
  18.     }
  19.  
  20.     abstract public function formato();
  21.  
  22. }
  23.  
  24. class MejoraRelojDigital extends AbstractReloj{
  25.  
  26.     // formato 12 o 24 horas y fecha del día
  27.     public function formato()
  28.     {
  29.         return sprintf('[ %s, %s ]',$this->formatoHora, $this->formatoFecha);
  30.     }
  31. }


Probamos nuestro cambio nuevamente
Código PHP:
Ver original
  1. $mejorReloj = new MejoraRelojDigital();
  2. $persona = new Persona();
  3. echo $persona->usar($mejorReloj)->verLaHora() .'<br>';


Si hiciste la prueba puedes apreciar que el reloj funciono sin ningún problema. La utilidad de las interfaces y las clases abstractas es que te permiten crear código mas flexible a los cambios, y eso lo pueden notar en que hicimos diferentes objetos y en cada caso no tuvimos que cambiar al objeto persona para que nuestro código siguiera funcionando.


El ejemplo es sencillo pero espero que con esto se aclare un poco la diferencia entre las interfaces y las clases abstractas lo siguiente es que experimentes con ellas.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: clase, diferencia, interfaz
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:57.