Attualmente sto cercando di padroneggiare C #, quindi sto leggendo Adaptive Code via C # di Gary McLean Hall .
Scrive di schemi e anti-schemi. Nella parte relativa alle implementazioni e alle interfacce scrive quanto segue:
Gli sviluppatori che sono nuovi al concetto di programmazione per le interfacce hanno spesso difficoltà a lasciar andare ciò che c'è dietro l'interfaccia.
Al momento della compilazione, qualsiasi client di un'interfaccia non dovrebbe avere idea dell'implementazione dell'interfaccia che sta utilizzando. Tale conoscenza può portare a presupposti errati che accoppiano il client a un'implementazione specifica dell'interfaccia.
Immagina l'esempio comune in cui una classe deve salvare un record in memoria persistente. Per fare ciò, giustamente delega a un'interfaccia, che nasconde i dettagli del meccanismo di archiviazione persistente utilizzato. Tuttavia, non sarebbe corretto formulare ipotesi su quale implementazione dell'interfaccia venga utilizzata in fase di esecuzione. Ad esempio, trasmettere il riferimento dell'interfaccia a qualsiasi implementazione è sempre una cattiva idea.
Potrebbe essere la barriera linguistica o la mia mancanza di esperienza, ma non capisco bene cosa significhi. Ecco cosa ho capito:
Ho un progetto divertente per il tempo libero per praticare C #. Lì ho una lezione:
public class SomeClass...
Questa classe è usata in molti posti. Durante l'apprendimento di C #, ho letto che è meglio astrarre con un'interfaccia, quindi ho fatto quanto segue
public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have.
public class SomeClass : ISomeClass <- Same as before. All implementation here.
Quindi ho inserito tutti i riferimenti di classe e li ho sostituiti con ISomeClass.
Tranne nella costruzione, dove ho scritto:
ISomeClass myClass = new SomeClass();
Sto capendo correttamente che questo è sbagliato? Se sì, perché sì, e cosa dovrei fare invece?
ISomeClass myClass = new SomeClass();
? Se intendi davvero quello, è ricorsione nel costruttore, probabilmente non quello che vuoi. Speriamo che intendi per "costruzione", cioè allocazione, forse, ma non nel costruttore stesso, giusto ?
ISomeClass
), ma è anche facile creare interfacce troppo generali per le quali è impossibile scrivere codice utile a quel punto le uniche opzioni devono ripensare l'interfaccia e riscrivere il codice o effettuare il downcast.