163 votos

¿Cómo sabré cuándo crear una interfaz?

Estoy en un punto en mi aprendizaje para el desarrollo, donde me siento como que tengo que aprender más acerca de las interfaces.

He leído con frecuencia sobre ellos, pero parece que no puedo comprender.

He leído algunos ejemplos como: los Animales de la clase base, con IAnimal interfaz para cosas como 'Caminar', 'Correr', 'GetLegs', etc, pero nunca he estado trabajando en algo y sentía como "Hey yo se debe utilizar una interfaz de aquí!"

¿Qué me estoy perdiendo? ¿Por qué es un concepto difícil para mí entender! Sólo estoy intimidado por el hecho de que yo nunca podría darse cuenta de una necesidad concreta de uno - en su mayoría debido a la ausencia de algunos aspectos de la comprensión de ellos! Me hace sentir como que me falta algo en la parte de arriba, en términos de ser un desarrollador! Si alguien ha tenido una experiencia como esta y un descubrimiento agradecería algunos consejos sobre la manera de entender este concepto. Gracias.

130voto

Jimmy Puntos 35501

resuelve este problema concreto:

usted tiene a, b, c, d de 4 tipos diferentes. todo el código que tienes algo así:

a.Process();
b.Process();
c.Process();
d.Process();

¿por qué no tienen implementar IProcessable y, a continuación, hacer

List<IProcessable> list;

foreach(IProcessable p in list)
    p.Process();

esta escala mucho mejor cuando usted agregar, por ejemplo, de 50 tipos de clases que todos hacen lo mismo.


Otro problema concreto:

¿Alguna vez has echado un vistazo a System.Linq.Enumerable? Se define un montón de métodos de extensión que funcionan sobre cualquier tipo que implementa IEnumerable. Porque cualquier cosa que implementa IEnumerable básicamente dice : "yo apoyo la iteración en una desordenada foreach-tipo de patrón", se puede definir comportamientos complejos (Count, Max, Donde, Seleccionar, etc.) para cualquier enumerable tipo.

113voto

rmeador Puntos 15107

Me gusta la respuesta de Jimmy mucho, pero siento que debo añadir algo a él. La clave de todo el asunto es que el "poder" en IProcess**es capaz de**. Indica una capacidad (o la propiedad, pero con el significado de "calidad intrínseca", no en el sentido de las propiedades de C#) del objeto que implementa la interfaz. IAnimal no es probablemente un buen ejemplo de una interfaz, pero IWalkable podría ser una buena interfaz en caso de que su sistema tiene muchas cosas que pueden caminar. Usted puede tener clases derivadas de Animales como el Perro, la Vaca, el Pescado, la Serpiente. Los dos primeros sería probablemente implementar IWalkable, los dos últimos, no a pie, así que no sería. Ahora te preguntarás "¿por qué no acaba de tener otro superclase, WalkingAnimal, que el Perro y la Vaca deriva de?". La respuesta es que cuando tienes algo completamente fuera de el árbol de herencia, que también se puede caminar, como un robot. El Robot debería implementar IWalkable, pero probablemente no se derivan de los Animales. Si desea una lista de cosas que pueden caminar, de escribir como IWalkable y se le puede poner a todos a caminar animales, más robots en la lista.

Ahora reemplazar IWalkable con algo más de software-y como IPersistable, y la analogía se convierte en mucho más cerca de lo que te gustaría ver en un programa real.

66voto

Element Puntos 2511

Utilice interfaces variará de implementaciones de la misma funcionalidad.

Utilice un resumen/base de clases cuando tienes que compartir una implementación concreta común.

28voto

Larsenal Puntos 17080

Creo que de una interfaz es un Contrato. Es una manera de decir, "Estas clases deben seguir estas reglas."

Así, en el IAnimal ejemplo, es una manera de decir, "tengo que ser capaz de llamar a Correr, Caminar, etc. en las clases que implementan IAnimal."

¿Por qué es útil? Es posible que desee construir una función que se basa en el hecho de que usted debe ser capaz de llamar a Correr y Caminar, por ejemplo, en el objeto. Usted podría tener el siguiente:

public void RunThenWalk(Monkey m) {
    m.Run();
    m.Walk();
}

public void RunThenWalk(Dog d) {
    d.Run();
    d.Walk();
}

... y repito que para todos los objetos que usted sabe que puede correr y caminar. Sin embargo, con su IAnimal de la interfaz, se puede definir la función de una vez de la siguiente manera:

public void RunThenWalk(IAnimal a) {
    a.Run();
    a.Walk();
}

Mediante la programación de la contra de la interfaz, básicamente está confiando en las clases para implementar la intención de la interfaz. Así, en nuestro ejemplo, el pensamiento es "no me importa cómo de que Andar y Correr, siempre Correr y Caminar. Mi RunThenWalk será válida siempre que se cumplan ese acuerdo. Funciona perfectamente sin necesidad de saber algo más acerca de la clase".

También hay una buena discusión en esta cuestión.

14voto

Karl Puntos 3336

Jimmy tiene derecho, cuando usted quiere ser capaz de utilizar una sola variable para varios tipos, pero todos los tipos de aplicar el mismo método a través de una interfaz de declaración. A continuación, puede llamar a un método main en la interfaz variable con tipo.

Hay una segunda razón para el uso de interfaces, sin embargo. Cuando el proyecto del arquitecto es una persona diferente a la implementación del codificador, o hay varias implementación de los codificadores y un gerente de proyectos. La persona a cargo puede escribir un montón de interfaces y ver que el sistema pueda funcionar, y luego dejar a los desarrolladores para llenar las interfaces con las clases de implementación. Esta es la mejor manera de asegurarse de que varias personas escriban compatible clases, y pueden hacerlo en paralelo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X