Actualmente estoy en el proceso de tratar de dominar C #, así que estoy leyendo Adaptive Code a través de C # por Gary McLean Hall .
Escribe sobre patrones y antipatrones. En la parte de implementaciones versus interfaces, escribe lo siguiente:
Los desarrolladores que son nuevos en el concepto de programación para interfaces a menudo tienen dificultades para soltar lo que está detrás de la interfaz.
En tiempo de compilación, cualquier cliente de una interfaz no debe tener idea de qué implementación de la interfaz está utilizando. Tal conocimiento puede conducir a suposiciones incorrectas que acoplan al cliente a una implementación específica de la interfaz.
Imagine el ejemplo común en el que una clase necesita guardar un registro en un almacenamiento persistente. Para hacerlo, delega correctamente a una interfaz, que oculta los detalles del mecanismo de almacenamiento persistente utilizado. Sin embargo, no sería correcto hacer suposiciones sobre qué implementación de la interfaz se está utilizando en tiempo de ejecución. Por ejemplo, transmitir la referencia de interfaz a cualquier implementación siempre es una mala idea.
Puede ser la barrera del idioma o mi falta de experiencia, pero no entiendo lo que eso significa. Esto es lo que entiendo:
Tengo un proyecto divertido de tiempo libre para practicar C #. Ahí tengo una clase:
public class SomeClass...
Esta clase se usa en muchos lugares. Mientras aprendía C #, leí que es mejor abstraer con una interfaz, así que hice lo siguiente
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.
Así que entré en algunas referencias de clase y las reemplacé con ISomeClass.
Excepto en la construcción, donde escribí:
ISomeClass myClass = new SomeClass();
¿Estoy entendiendo correctamente que esto está mal? En caso afirmativo, ¿por qué y qué debo hacer en su lugar?
ISomeClass myClass = new SomeClass();
? Si realmente quiere decir eso, eso es recurrencia en el constructor, probablemente no lo que quiere. Esperemos que se refiera a" construcción ", es decir, asignación, tal vez, pero no en el propio constructor, ¿verdad? ?
ISomeClass
), pero también es fácil crear interfaces demasiado generales para las que es imposible escribir código útil en cuyo momento las únicas opciones son para repensar la interfaz y reescribir el código o para bajar.