Recientemente, comencé a entender cómo funciona la OOP, y ahora llego al punto en que cuanto más leo sobre las diferencias entre las clases abstractas y las interfaces, más me confundo. Hasta ahora, ninguno puede ser instanciado. Las interfaces son planos más o menos estructurales que determinan que el esqueleto y los resúmenes son diferentes al poder implementar parcialmente el código.
Me gustaría aprender más sobre estos a través de mi situación específica. Aquí hay un enlace a mi primera pregunta si desea un poco más de información de fondo: ¿Cuál es un buen modelo de diseño para mi nueva clase?
Aquí hay dos clases que creé:
class Ad {
$title;
$description
$price;
function get_data($website){ }
function validate_price(){ }
}
class calendar_event {
$title;
$description
$start_date;
function get_data($website){ //guts }
function validate_dates(){ //guts }
}
Entonces, como puede ver, estas clases son casi idénticas. No se muestran aquí, pero hay otras funciones, like get_zip()
, save_to_database()
que son comunes en mis clases. También he agregado otras clases Cars y Pets que tienen todos los métodos comunes y, por supuesto, propiedades específicas de esas clases (kilometraje, peso, por ejemplo).
Ahora he violado el principio DRY y estoy administrando y cambiando el mismo código en varios archivos. Tengo la intención de tener más clases como botes, caballos o lo que sea.
Entonces, ¿es aquí donde usaría una interfaz o una clase abstracta? Por lo que entiendo sobre las clases abstractas, usaría una superclase como plantilla con todos los elementos comunes integrados en la clase abstracta, y luego agregaría solo los elementos específicamente necesarios en futuras clases. Por ejemplo:
abstract class content {
$title;
$description
function get_data($website){ }
function common_function2() { }
function common_function3() { }
}
class calendar_event extends content {
$start_date;
function validate_dates(){ }
}
¿O usaría una interfaz y, debido a que son tan similares, crearía una estructura que cada una de las subclases se ve obligada a usar por razones de integridad, y se la dejaría al desarrollador final que desarrolle esa clase para ser responsable de cada una de las subclases? detalles de incluso las funciones comunes. Creo que es posible que algunas funciones 'comunes' deban ajustarse en el futuro para las necesidades de su clase específica.
A pesar de todo lo anterior, si cree que estoy malinterpretando el qué y el por qué de las clases e interfaces abstractas, ¡deje que una respuesta válida deje de pensar en esta dirección y sugiera la forma correcta de avanzar!
¡Gracias!