¿Cuándo implementar y extender? [cerrado]


90
  • ¿Cuándo debería implemento extendutilizarse?
  • ¿Cuáles son algunos ejemplos del mundo real?

¿Es esto correcto?

La implementación parece ser una forma de hacer cumplir ciertos métodos en una clase y que las llamadas a funciones de estos métodos están formateadas correctamente. ¿Implementar no es una forma de pasar variables o "configuraciones" a la clase?

Escenario esperado de la vida real: tengo una plataforma de comercio electrónico con múltiples 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 del interfacepara garantizar que todos los bits y piezas estén ahí, desde el principio.

La extensión de clases hace que la clase extendida (¿hijo?) Herede todo de su clase padre, excepto los métodos y variables declarados como private?

Escenario esperado de la vida real: tengo una clase llamada sessionscon dos clases secundarias llamadas sessioncookiesy databasesessions. sessioncookiesy databasesessions, juntos, heredan una serie de opciones de configuración mutuas de sus sesiones principales, lo que facilita el cambio de una opción de configuración para afectar todo tipo de almacenamiento de datos de visitantes eventuales.


1
Te recomiendo que leas sobre la herencia.
Rafe Kettler

Respuestas:


64

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.

Las interfaces (y implements) son útiles cuando desea definir un protocolo común sobre cómo debe comportarse un grupo de objetos. Por ejemplo, es posible que desee exigir 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 consistencia colocando esas características en una interfaz para ser implementadas por esas clases relacionadas.

La herencia es un gran concepto en OOP que va mucho más allá de PHP. Te recomiendo que leas el artículo de Wikipedia sobre herencia y tal vez Patrones de diseño de la banda de los cuatro .

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


4
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 permite una lectura más ligera. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"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

1
"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 otra manera no tienen nada en común. Por lo general, también puede modelar sus clases como relaciones has-a en lugar de is-a, lo que facilitará aún más la reutilización del código y el polimorfismo.
Duncan

12

Implementar:

Las interfaces son clases abstractas, por lo que solo puede declarar cosas. Una clase implementa una interfaz. Puede implementar múltiples interfaces.

Ampliar:

Usted extender las clases cuando se desea una versión más específica de una clase.

Ejemplo:

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

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


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Tanto Camel como Dog son animales, por lo que amplían la Animalclase. Pero solo el Perro es un tipo específico de Animalque también puede ser unPet

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.