Di recente ho iniziato a avvolgere la mia testa intorno a OOP, e ora sono al punto in cui più leggo delle differenze tra classi astratte e interfacce, più divento confuso. Finora, nessuno dei due può essere istanziato. Le interfacce sono schemi più o meno strutturali che determinano lo scheletro e gli abstract sono diversi essendo in grado di implementare parzialmente il codice.
Vorrei saperne di più su questi attraverso la mia situazione specifica. Ecco un link alla mia prima domanda se desideri ulteriori informazioni di base: qual è un buon modello di design per la mia nuova classe?
Ecco due classi che ho creato:
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 }
}
Quindi, come puoi vedere, queste classi sono quasi identiche. Non è riportato, ma ci sono altre funzioni, like get_zip()
, save_to_database()
che sono comuni a tutti i miei corsi. Ho anche aggiunto altre classi di auto e animali domestici che hanno tutti i metodi comuni e, naturalmente, proprietà specifiche per quelle classi (chilometraggio, peso, ad esempio).
Ora ho violato il principio DRY e sto gestendo e modificando lo stesso codice su più file. Ho intenzione di avere più classi come barche, cavalli o altro.
Quindi è qui che utilizzerei un'interfaccia o una classe astratta? Da quello che ho capito delle classi astratte, userei una super classe come modello con tutti gli elementi comuni incorporati nella classe astratta, quindi aggiungerei solo gli elementi specificamente necessari nelle classi future. Per esempio:
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 userei un'interfaccia e, poiché sono così simili, creerei una struttura che ciascuna delle sottoclassi è costretta a usare per motivi di integrità e la lascerei allo sviluppatore finale che completa quella classe per essere responsabile di ciascuna delle dettagli anche delle funzioni comuni. il mio pensiero è che in futuro potrebbe essere necessario modificare alcune funzioni "comuni" per le esigenze della loro classe specifica.
Nonostante tutto quanto sopra, se credi che io fraintenda il cosa e il perché di classi e interfacce astratte del tutto, lascia che una risposta valida sia smettere di pensare in questa direzione e suggerisci il modo corretto di andare avanti!
Grazie!