In C # non c'è molta differenza.
La differenza sta in ciò che puoi chiamare sul riferimento che hai creato.
Questo codice
ICustomer customer = new Customer();
crea un riferimento di interfaccia chiamato customer
all'istanza creata dalla chiamata new Customer();
.
Questo codice
Customer customer = new Customer();
crea un riferimento oggetto nome customer
all'istanza creata dalla chiamata new Customer();
.
Sebbene entrambi i riferimenti facciano riferimento a un'istanza della classe Customer
, sono diversi. Il riferimento all'interfaccia offre solo ciò che è definito nell'interfaccia ICustomer
, indipendentemente da cos'altro renderà disponibile la classe Customer
. Utilizzando il riferimento all'oggetto puoi utilizzare tutto ciò che la classe Customer
deve offrire.
Usando un riferimento all'interfaccia si dovrebbe ricondurlo alla classe di implementazione per utilizzare la roba "aggiuntiva" offerta dalla classe. Qualcosa che fai veramente non . Dopo tutto, quando si passa un riferimento all'interfaccia non si può essere certi di quale classe è stata utilizzata per creare un'istanza dell'oggetto a cui fa riferimento. C'è davvero un'eccezione a questa regola: quando hai appena creato il riferimento all'interfaccia e hai bisogno di usare metodi che non vuoi mettere nell'interfaccia perché sono necessari solo durante la costruzione / costruzione / inizializzazione dell'istanza. E anche questo dovrebbe essere un caso raro.
Per C # è tutto.
Per le lingue in cui lo sviluppatore è responsabile della gestione a vita esplicita degli oggetti che sono istanziati (dovendo liberare esplicitamente ciascun oggetto), ci può essere un'enorme differenza tra i due modi di fare riferimento all'oggetto istanziato.
In Delphi, ad esempio, gli oggetti interfacciati (istanze di una classe che implementa un'interfaccia) sono conteggiati come riferimento per impostazione predefinita e vengono "automaticamente" liberati quando il loro conteggio dei riferimenti scende a zero. Il conteggio dei riferimenti viene incrementato e decrementato dalle chiamate _AddRef
e _Release
che vengono aggiunte automaticamente al tuo codice dal compilatore.
In Delphi non si vuole veramente mai creare un riferimento ad un oggetto di una classe interfacciata. Ciò significa che il compilatore non inserirà la chiamata _AddRef
che incrementa il conteggio dei riferimenti a 1 all'istanziazione. Il che significa che il conteggio dei riferimenti è troppo basso. Ciò significa che l'istanza verrà liberata troppo presto.
Ecco perché il consiglio per linguaggi come Delphi è di non mescolare mai riferimenti di interfaccia e oggetto e usare sempre riferimenti di interfaccia per classi interfacciate .