¿Cuándo implementar y extender? [closed]

5 minutos de lectura

avatar de usuario
Industrial

  • Cuando debe implement o extend ¿ser usado?
  • ¿Cuáles son algunos ejemplos del mundo real?

¿Es esto correcto?

Implementar parece ser una forma de hacer cumplir que ciertos métodos existen en una clase, y que estas llamadas a funciones de métodos tienen el formato correcto. Implementar es no Sin embargo, ¿una forma de pasar variables o “configuraciones” a la clase?

Escenario esperado de la vida real: Tengo una plataforma de comercio electrónico con varias clases de pago que siguen el mismo diseño. Cuando se debe agregar una nueva clase de pago, es muy fácil seguir el diseño definido de la interface para asegurarse de que todas las partes estén ahí, desde el principio.

Extensión clases hace que la clase extendida (¿secundaria?) herede todo de su clase principal, excepto los métodos y las variables declaradas como private?

Escenario esperado de la vida real: tengo una clase llamada sessions con dos clases secundarias llamadas sessioncookies y databasesessions. sessioncookies y databasesessionsjuntos heredan una serie de opciones de configuración mutuas de sus sesiones principales, lo que facilita cambiar una opción de configuración para afectar todo tipo de almacenamiento de datos de visitantes eventuales.

  • Le recomiendo que lea sobre la herencia.

    – Rafe Kettler

    10 de febrero de 2011 a las 19:54


La herencia es útil para reducir la cantidad de código que reescribe. Si tiene varias clases con algunos métodos o campos comunes, en lugar de definir estos métodos y campos una y otra vez, puede factorizarlos en una clase base y hacer que cada una de las clases secundarias amplíe esa clase base.

Interfaces (y implements) son útiles cuando desea definir un común protocolo cómo debe comportarse un grupo de objetos. Por ejemplo, es posible que desee ordenar que los objetos que son comparables se puedan comparar por igualdad y hash, etc.

El uso de la herencia es, en última instancia, una elección de diseño. Esté atento a los casos en los que defina los mismos métodos en varias clases; esos son casos excelentes en los que puede factorizar esos métodos en una clase base. Lo mismo ocurre con las clases que observan algunas de las mismas características: puede garantizar la coherencia colocando esas características en una interfaz para que las implementen esas clases relacionadas.

La herencia es un gran concepto en programación orientada a objetos que va mucho más allá de PHP. te recomiendo que leas el artículo de wikipedia sobre la herencia y quizás Design Patterns de Gang of Four.

Creo que su comprensión de la herencia es principalmente correcta. El siguiente paso sería usarlo en producción.

  • Mucha gente ahora considera que el libro The Gang of Four es demasiado pesado en términos de material como una introducción a los patrones de diseño. Una alternativa popular es Head First: Design Patterns, que facilita la lectura. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124

    – Bendihossan

    7 de noviembre de 2012 a las 9:19


  • “Esté atento a los casos en los que defina los mismos métodos en varias clases; esos son casos excelentes en los que puede factorizar esos métodos en una clase base”. ¿Extender una clase tendría un beneficio sobre el uso de un rasgo para definir esos métodos?

    –Daniel Weiner

    19 mayo 2015 a las 17:04

  • “La herencia es útil para reducir la cantidad de código que se reescribe”: el propósito de la herencia es compartir el comportamiento, no el código. Siempre que sea posible, los rasgos son la forma de compartir código en lugar de extender una clase abstracta con clases concretas que, de otro modo, no tienen nada en común. Por lo general, también puede modelar sus clases como relaciones tiene-a en lugar de es-a, lo que facilitará aún más la reutilización del código y el polimorfismo.

    – Duncan

    28 de febrero de 2019 a las 1:32

avatar de usuario
Ahmad Mobaraki

Implementar:
Las interfaces son clases abstractas sin detalles de implementación, por lo que solo puede declarar cosas (Contratos). Una clase implementa una interfaz para asegurarse de que sigue las reglas y los contratos de la interfaz. Una clase puede implementar múltiple interfaces

Extender:
extender clases cuando quieras versión más específica de una clase Y tampoco desea repetir la escritura de otros métodos que existen en la clase principal.

Ejemplo:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat(){ //details };
    public void sleep(){ //details };
}


public class Camel extends Animal {
    // no need to implement eat() and sleep() but
    // either of them can be implemented if needed. i.e. 
    // if Camel eats or sleeps diffrently from other animals!
}

public class Dog extends Animal implements Pet {    
    public void play() {
       // MUST implemt play() details           
    }
}

Tanto el camello como el perro son animales, por lo que se extienden Animal clase. Pero sólo el Perro es un tipo específico de Animal que además puede ser un Pet.

Como puede ver, este hilo está cerrado porque es una base de opinión, no hay una respuesta correcta exacta. Es una elección de diseño y depende de la situación y las necesidades del proyecto. tienes ambas opciones disponibles, ahora puedes decidir cuál es la mejor opción. por ejemplo, la clase de perros no tiene que ser siempre como en el ejemplo anterior, si el proyecto se trata de los diferentes tipos de perros (y no de otros animales) e incluso la diferencia entre dormir y comer es importante. puede ser asi:

// the main contract
public interface Dog {
   public void eat();
   public void sleep();
} 

// Contract
public interface Pet {
    public void play(); 
} 

// Contract
public interface Hunter {
    public void hunt();
}

public class FamilyDogs implements Dog, Pet {
    // must implement all details
} 

public class GuardDogs implements Dog, Hunter {    
    // must implement all details
}

¿Ha sido útil esta solución?