Recentemente ho iniziato a girare la testa intorno a OOP, e ora sono al punto in cui più leggo sulle differenze tra classi astratte e interfacce più divento confuso. Finora, nessuno dei due può essere istanziato. Le interfacce sono più o meno progetti strutturali che determinano lo scheletro e gli abstract sono diversi in quanto sono in grado di implementare parzialmente il codice.
Mi piacerebbe saperne di più su questi attraverso la mia situazione specifica. Ecco un link alla mia prima domanda se desideri un po 'più di informazioni di base: Che cos'è un buon modello di progettazione 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 mostrato qui, ma ci sono altre funzioni, like get_zip()
, save_to_database()
che sono comuni tra le mie classi. Ho anche aggiunto altre classi Cars e Animali che hanno tutti i metodi comuni e naturalmente le proprietà specifiche di quelle classi (chilometraggio, peso, per esempio).
Ora ho violato il principio DRY e sto gestendo e modificando lo stesso codice su più file. Intendo avere più classi come barche, cavalli o qualsiasi altra cosa.
Quindi è qui che utilizzerei un'interfaccia o una classe astratta? Da ciò che capisco delle classi astratte, utilizzerei una super classe come modello con tutti gli elementi comuni incorporati nella classe astratta e quindi aggiungerei solo gli elementi specificatamente necessari nelle classi future. Ad 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 dovrei usare un'interfaccia e, poiché sono così simili, creare una struttura che ciascuna delle sottoclassi sia obbligata a usare per ragioni di integrità, e lasciare che sia lo sviluppatore finale a capire che quella classe è responsabile per ciascuno dei dettagli anche delle funzioni comuni. il mio pensiero è che alcune funzioni "comuni" potrebbero aver bisogno di essere ottimizzate in futuro per le esigenze della loro classe specifica.
Nonostante tutto quanto sopra, se credi di fraintendere il cosa e il perché delle classi e delle interfacce astratte del tutto, lascia che una risposta valida smetta di pensare in questa direzione e suggerisca il modo corretto di andare avanti!
Grazie!