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

Interface, implements

Estas en el tema de Interface, implements en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola quetal pues soy nuevo en php5 y tengo algo de tiempo en php en versiones anteriores la pregunta mia es para que me puede ...
  #1 (permalink)  
Antiguo 06/02/2009, 14:00
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Interface, implements

hola quetal pues soy nuevo en php5 y tengo algo de tiempo en php en versiones anteriores la pregunta mia es para que me puede servir una interface? he leido que al implementar una interfaz diferentes clases que realicen una misma accion la pueden contener se entiende? jeje pues entonces realice este codigo

Pero no entiendo que me gano con declarar la interface en Utiles y tener que escribir el codigo en otro lado no es algo raro? bueno de esa forma lo veo yo y se que tiene muchos usos q no me he dado cuenta o por lo menos eso creo alguien me podria decir en que me beneficiaria al crear una interface e implementarla

Muchas gracias
Código PHP:
interface Utiles
{
    public function 
suma($num1,$num2);
    public function 
resta($num1,$num2);
    public function 
division($num1,$num2);
    
}



class 
Operaciones implements Utiles

{    
    protected 
$resultado;
    protected 
$suma;
    protected 
$resta;
    protected 
$division;
    
    public function 
suma($num1,$num2)
    {
        
$this->resultado=$num1+$num2;
        return 
$this->resultado;
        
    }
    
    public function 
resta($num1,$num2)
    {
        
$this->resultado=$num1-$num2;
        return 
$this->resultado;
        
    }
    public function 
division($num1,$num2)
    {
        
$this->resultado=$num1/$num2;
        return 
$this->resultado;
        
    }
    
    
    
}
//creando la interfaze
$objetoUtiles=new Operaciones;
echo 
$objetoUtiles->suma(5,5)."<br>"
  #2 (permalink)  
Antiguo 06/02/2009, 19:21
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: Interface, implements

Una interfaz es una "firma", sirve para definir que cierto objeto que la implemente lo va funcionar, esto cuando desarrollas en entre muchas personas sirve bastante, por ejemplo:
Código php:
Ver original
  1. interface Encendible {
  2.          public function enciende();
  3. }

Cuando tu tienes por ejemplo un objeto que "enciende" objetos, tienes que de cierta forma garantizar que los objetos que le pases sean encendibles:
Código php:
Ver original
  1. public function enciende( Encendible $objeto ) {
  2.          $objeto->enciende();
  3. }

Al tu especificar una interfaz le puedes decir a los demas desarrolladores, para que tu código funcione con mi sistema, tienes que implementar la interfaz, así los demas desarrolladores lo implementan:

Desarrollador1:
Código php:
Ver original
  1. class cerillo implements Encendible {
  2.        public function enciende() {
  3.                 echo "Cerillo encendido!";
  4.        }
  5. }

Desarrollador 2:
Código php:
Ver original
  1. class foco implements Encendible {
  2.        public function enciende() {
  3.                 echo "Foco encendido!";
  4.        }
  5. }

Entonces los dos desarrolladores al implementar su código y pasarlo por tu clase, al llegar al método enciende() van a funcionar como deben.

Espero con esto entiendas la utilidad, es mayor todavía, por ejemplo yo en mi componente DataGrid, puedo mostrar una grilla desde un DataSource, este DataSource es una interfaz, que si tu la implementas puedes usar mi DataGrid con tu fuente de datos que quieras (ya sea una BDD, un XML, un HTML, etc.) Al usar la interfaz puedes usar el Grid y no te preocupas por como funciona el Grid, solamente te enfocas en la parte de implementar la fuente de datos.

Saludos
  #3 (permalink)  
Antiguo 06/02/2009, 20:20
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: Interface, implements

Ok muchas gracias por tu respuesta la verdad me sirvio mucho
  #4 (permalink)  
Antiguo 06/02/2009, 23:12
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: Interface, implements

Cita:
hola quetal pues soy nuevo en php5 y tengo algo de tiempo en php en versiones anteriores la pregunta mia es para que me puede servir una interface? he leido que al implementar una interfaz diferentes clases que realicen una misma accion la pueden contener se entiende? jeje pues entonces realice este codigo
¿"la pueden contender"? ¿a la interfaz? ¿qué libro estuviste leyendo?

La herencia agrupa clases que tiene SI O SI una relación de parentesco: Avioneta es un tipo de Avión, el hombre es un tipo de animal, etc.

Las interfaces, por lo contario, agrupan clases que HACEN LO MISMO y no tiene nada que ver con la relación de parentesco.

Tanto las herencias como las interfaces sirven para poder aplicar el polimorfismo.

Cita:
Pero no entiendo que me gano con declarar la interface en Utiles y tener que escribir el codigo en otro lado no es algo raro?
Es que estás observando al lenguaje por el lado de la sintaxis y no de los conceptos. Las interfaces son "contratos de implementación" y entran en cuento cuando existe una clase que ofrece un "servicio" y otra que lo "consume". Para ser consistentes deberíamos a todos los objetos pedirles el mismo comportamiento para que este servicio funcione y ahí entra en juego las interfaces: controlas que todas las clases que quieran usar el servicio sea de tipo "alguna interfaz que defina qué deben tener las clases para que pueda funcionar correctamente el servicio sin que falte nada".

Trata de buscar el término "contrato de implementación" e "interfaces" y encontrarás que hemos hablado varias veces de este tema.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 07/02/2009, 00:01
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Interface, implements

En mi caso... resumido muy simplemente, uso interfaces para asegurarme que los objetos que voy a ocupar, tengan los métodos que llamaré.

Pero como dice GatorV, conceptualmente, una interfaz es algo más que eso.
__________________
Blog | Tecnosquad
  #6 (permalink)  
Antiguo 07/02/2009, 09:46
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: Interface, implements

Ok muchas gracias pero volviendo al caso que pena ser tan incistente solo que necesito despejar dudas que no encuentro en otros lados

Digamos que tengo una interfaz encendible que la implementan diferentes desarolladores pero aqui esta mi duda cada persona la implementa pero es libre de escribir lo que quiera cuando la llama es decir

1.
interface Encendible {
2.
public function enciende();
3.
}

Los desarolladores pueden escribir lo que quieran cada vez que llaman la interfaz o deben tener todos los desarrolladores el mismo codigo? no se si entiendan Gracias

class cerillo implements Encendible {
       public function enciende() {
                echo "El cerillo se encuentra encendido !";
       }
}


class cerillo implements Encendible {
public function enciende() {
echo "Cerillo encendido!";
}
}
  #7 (permalink)  
Antiguo 07/02/2009, 11:16
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: Interface, implements

Estimado Acoevil:

¿Estás intentando leer algún material conceptual del tema o vas a seguir intentando a prueba y error descubrir el concepto de las interfaces y el polimorfismo?

Como comentaba anteriormente, es un "contrato de implementación" y ese es el centro del asunto. Si tu haces una clase "Impresora" (que ofrece el servicio de imprimir cualquier cosa que recibe), deberá poder recibir objetos que tenga la capacidad de poder decirle a la impresora "qué imprimir".

Código PHP:

class Impresora
{
   public function 
imprimir($objetoImprimible)
   {
      echo 
$objetoImprimible->getContenidoImprimible();
   }
}

class 
Hola
{
   public function 
getContenidoImprimible()
   {
      return 
"soy una hoja";
   }
}
// Funciona
Impresora::imprimir(new Hoja());

class 
Informe extends Hoja
{
}

// Funciona
Impresora::imprimir(new Curriculum());

class 
Libro
{
}

// No funciona!
Impresora::imprimir(new Libro()); 
Funciona? Depende de cómo esté implementado la Impresora, aquí usa polimorfismo, el tema es ... qué método va a ejecutar de cada objeto que recibe? cómo queda consistente al diseño? cómo aseguro que las clases lo cumplan?

Lo que hicimos anteriormente lo llamo "polimorfismo débil" o "de palabra", ya que el diseño es débil y no asegura que la clase Impresora no se rompa ante una clase que no cumple con el "contrato de palabra" de tener el método para entregar el contenido imprimible.

Puedes hacer "polimorfismo por herencia" y hacer que el diseño sea más robusto

Código PHP:
class Impresora
{
   public function 
imprimir(Hoja $objetoImprimible)
   {
      echo 
$objetoImprimible->getContenidoImprimible();
   }

Aquí aseguramos que la impresora solo acepte elementos de tipo Hoja, por lo tanto el informe es también de tipo hoja y como hoja tiene el método obtener contenido, este diseño es más consistente que el primero (todo objeto que quiera pasar que no sea de tipo Hoja será rechazado y la clase no intenta imprimir algo que no se puede).

Ahora el punto es, qué hacemos con el libro? Sí tiene hojas, pero no es un tipo de hoja, tampoco vamos a crear una impresora por cada tipo de elemento que queremos imprimir (impresora de hojas e impresora de libros).

Bien, aquí es donde se necesitan las interfaces. Creas una interfaz Imprimible que tiene solo la firma del método getContendioImprimible y defines que la Impresora solo acepta objetos "imprimibles".

Lo que sucede es lo siguiente:
  1. Si modificas la clase para que valide la interfaz, cualquier objeto que quiera pasar por el método este le dirá que tiene que cumplir la interfaz Imprimible
  2. Cuando a la clase le agregas "implements Imprimible", automáticamente el sistema que dirá que te falta la implementación del método getContenidoImprimible
  3. Una vez que lo implementes, recién ahí podrás acceder al método "imprimir".
A eso se le llama "contrato de implementación", necesitas "firmar" un contrato para poder obtener un "servicio", lo cual esto asegura una serie de condiciones para poder usarlo.

¿Qué pasa si el método lo implementas vacío? Ese no es problema de la interfaz, es de la clase que no hizo lo que debía, cada objeto tiene la responsabilidad de proveer el contenido correspondiente (es más, todavía puedes validar que la impresora retorne una excepción si el método "contenido" retorna vacío) y cada objeto diferirá del otro cómo implementará su parte.


PD: te lo digo con el mayor de los respetos, sal de la ignorancia, no seas necio y buscan un libro o un tutorial que hable de los conceptos de la POO y toque el tema de interfaces, más allá de la sintaxis.

"Un millón de monos golpeando un teclado no generarán un sistema funcional", lo que significa que sin el conocimiento base suficiente no lo vas a lograr.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 07/02/2009, 19:34
 
Fecha de Ingreso: junio-2008
Ubicación: Bogotá D.C. / Colombia
Mensajes: 4
Antigüedad: 15 años, 9 meses
Puntos: 0
Mensaje Respuesta: Interface, implements

Saludos, la verdad es que con este post he comenzado a comprender muchas cosas que creeía saber pero que ahora veo que no.

Siempre he sabido que la interfaces son fundamentales en la programación para llegar al máximo nivel de abstracción y tener una especie de plantilla para que las clases que la implementan sepan que deben hacer por default, pero pues veo que esto tiene una importancia mayor y la aplicación en el filtrado de objetos que has hecho me parece genial, así que decidí hacer un código en java para probar cada cosa que decías ya que desde mi punto de vista es un lenguaje que exige programación orientada a objetos.

Cita:
Iniciado por enriqueplace Ver Mensaje
Estimado Acoevil:

Bien, aquí es donde se necesitan las interfaces. Creas una interfaz Imprimible que tiene solo la firma del método getContendioImprimible y defines que la Impresora solo acepta objetos "imprimibles".

Lo que sucede es lo siguiente:
  1. Si modificas la clase para que valide la interfaz, cualquier objeto que quiera pasar por el método este le dirá que tiene que cumplir la interfaz Imprimible
  2. Cuando a la clase le agregas "implements Imprimible", automáticamente el sistema que dirá que te falta la implementación del método getContenidoImprimible
  3. Una vez que lo implementes, recién ahí podrás acceder al método "imprimir".
A eso se le llama "contrato de implementación", necesitas "firmar" un contrato para poder obtener un "servicio", lo cual esto asegura una serie de condiciones para poder usarlo.
Código PHP:

public interface Imprimible {
    
    public 
void getContenidoImprimible();

}

public class 
Hoja implements Imprimible {

    public 
void getContenidoImprimible(){
        
System.out.println("Soy una hoja");
    }
    
}

public class 
Carro {

}


public class 
Impresora {
    
    public 
void imprimir(Imprimible objetoImprimible){
        
objetoImprimible.getContenidoImprimible();
    }
    
    public static 
void main(String args[]){
        
Impresora impresora = new Impresora();
        
Hoja hoja = new Hoja();
        
Carro carro = new Carro();
        
impresora.imprimir(hoja);
        
impresora.imprimir(carro); // Produce error
    
}


]

Última edición por neftons; 07/02/2009 a las 19:40
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.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:21.