Je suis actuellement en train d'essayer de maîtriser le C #, donc je lis Adaptive Code via C # par Gary McLean Hall .
Il écrit sur les modèles et les anti-modèles. Dans la partie implémentations versus interfaces, il écrit ce qui suit:
Les développeurs qui sont nouveaux dans le concept de programmation vers les interfaces ont souvent du mal à abandonner ce qui se cache derrière l'interface.
Au moment de la compilation, tout client d'une interface ne devrait avoir aucune idée de l'implémentation de l'interface qu'il utilise. De telles connaissances peuvent conduire à des hypothèses incorrectes qui couplent le client à une implémentation spécifique de l'interface.
Imaginez l'exemple courant dans lequel une classe doit enregistrer un enregistrement dans un stockage persistant. Pour ce faire, il délègue à juste titre à une interface, qui cache les détails du mécanisme de stockage persistant utilisé. Cependant, il ne serait pas juste de faire des hypothèses sur l'implémentation de l'interface utilisée au moment de l'exécution. Par exemple, la conversion de la référence d'interface dans n'importe quelle implémentation est toujours une mauvaise idée.
C'est peut-être la barrière de la langue ou mon manque d'expérience, mais je ne comprends pas très bien ce que cela signifie. Voici ce que je comprends:
J'ai un projet amusant de temps libre pour pratiquer le C #. Là j'ai une classe:
public class SomeClass...
Cette classe est utilisée dans de nombreux endroits. En apprenant le C #, j'ai lu qu'il valait mieux résumer avec une interface, donc j'ai fait ce qui suit
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.
Je suis donc allé dans toutes les références de classe et les ai remplacées par ISomeClass.
Sauf dans la construction, où j'ai écrit:
ISomeClass myClass = new SomeClass();
Est-ce que je comprends bien que c'est faux? Si oui, pourquoi et que dois-je faire à la place?
ISomeClass myClass = new SomeClass();
? Si vous voulez vraiment dire cela, c'est la récursivité dans le constructeur, probablement pas ce que vous voulez. ?
ISomeClass
), mais il est également facile de créer des interfaces trop générales pour lesquelles il est impossible d'écrire du code utile contre lequel les seules options sont de repenser l'interface et de réécrire le code ou de downcast.