¿Por qué usamos Interface? ¿Es solo para estandarización? [cerrado]

79

¿Por qué usamos Interface?

¿Es solo para estandarización?

Azhar
fuente
1
Opuesto a...? las interfaces tienen muchos usos ...
Jason
6
Realmente desearía que la gente no pusiera etiquetas como c # en publicaciones que no son específicas de c #. Es una pregunta realmente genial, y podría haberla perdido porque c # es una etiqueta ignorada.
Tyler Carter

Respuestas:

171

Propósitos de las interfaces

  • crear software débilmente acoplado
  • diseño de soporte por contrato (un implementador debe proporcionar la interfaz completa)
  • permitir software enchufable
  • permitir que diferentes objetos interactúen fácilmente
  • ocultar los detalles de implementación de las clases entre sí
  • facilitar la reutilización del software

Analogía 1 : al igual que el transbordador espacial estadounidense, la nave espacial rusa Soyuz y la china Shenzhou 5 pueden acoplarse a la Estación Espacial Internacional porque implementan la misma interfaz de acoplamiento. (Este es solo un ejemplo, no sé si es cierto en la vida real, sin embargo, suspendamos nuestra incredulidad por un ejemplo)

Analogía 2 : como si pudiera conectar varios monitores de computadora a la computadora de su hogar. Puede conectarle un televisor del tamaño de una pared, un viejo CRT (del tipo grueso), una pantalla plana de 20 "o una máquina braille para que las personas ciegas" vean "al tacto. Hay compatibilidad entre estos distintos dispositivos y su computadora porque todos están de acuerdo con los estándares de interfaz.

Detalles de las interfaces C #: con las interfaces C # / OOP, está haciendo el mismo tipo de cosas pero en el mundo invisible / virtual.

Tiene razón sobre la estandarización , pero también sobre flexibilidad , escalabilidad , extensibilidad , capacidad de mantenimiento , reutilización , capacidad de prueba y potencia .

(Cuanto más use interfaces de software, más se entenderán estas "palabras de moda". Y siempre considere las interfaces en el mundo real porque nos han funcionado igualmente bien).

John K
fuente
18
Dejaste fuera mi uso favorito de las interfaces: la capacidad de prueba. Si tengo dos clases, A y B, y A.foo llama a B.bar, entonces, siempre que B implemente una interfaz y pueda "inyectarse" en A, entonces puedo usar una clase simulada, falsa o de código auxiliar en lugar de el B. real. Esto es especialmente útil cuando A.foo cambia su comportamiento basándose en el valor de retorno de B.bar. (Digamos que B.bar devuelve un bool. A.foo podría tener una declaración if (B.bar) con una cláusula else.) El uso de una interfaz en B me permite crear mockB, fakeB y / o stubB que me permiten probar qué sucede cuando B.bar devuelve verdadero o falso.
aridlehoover
@Alan R: se agregó la prueba. Gracias.
John K
1
La respuesta aceptada es TOP y es refrescante ver que el concepto no se descarta, ya que la mayoría de los materiales de las pautas de diseño de marcos no lo explican o comprenden. Solo agrego que si estás usando genéricos en serio, no sé cómo te las arreglaste sin ellos.
rama-jka toti
6
+1 parastandardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
Ravi
29

Se usa una interfaz para describir lo que puede hacer una cosa implementada. Por lo tanto, tiene la posibilidad de tratar varios objetos que implementan la misma interfaz como un tipo de esta interfaz.

Por ejemplo:

public interface IMyInterface{
    public void DoFirst();
    public int DoSecond();
}


public class A : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blubb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blubb2");
     return 2;  
   }
}

public class B : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blibb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blibb2");  
     return 4;
   }
}

Las clases implementan la Interfaz de varias formas. Pero puede usarlos como IMyInterface. Por ejemplo:

public static void DoMethodsInInterface(IMyInterface inter){
    inter.DoFirst();
    inter.DoSecond();
}


public static void main(){

   DoMethodsInInterface(new A());
   DoMethodsInInterface(new B());
   //Or use it in a List
   List<IMyInterface> interlist = new List<IMyInterface>();
   interlist.Add(new A());
   interlist.Add(new B());
   foreach(IMyInterface inter in interlist){
      inter.DoFirst();
   }

}

Espero que esto aclare un poco por qué las interfaces son útiles.

martín
fuente
2
Esta pregunta se vinculó a partir de una pregunta que pregunta por qué usar interfaces en lugar de simplemente tener miembros que realicen las funciones apropiadas, etc., y su respuesta se acerca más a responder esa. Si dos clases no relacionadas tienen ambas un método Woozle, cualquier código que quisiera aceptar una referencia a cualquiera de las clases y Woozletendría que saber con qué clase estaba tratando, y solo podría conocer las Woozleclases que conocía. Por el contrario, si ambas clases se implementan IWoozler, entonces el código que se proporciona IWoozlerpuede Woozlehacerlo sin tener que saber su tipo exacto.
supercat
Esta respuesta lo clava mejor que cualquier otra que haya visto. Se trata de lo que puede hacer un objeto. Las interfaces especifican un conjunto de acciones relacionadas con el objeto sin dictar qué sucede dentro de esas acciones que obviamente serían específicas del objeto.
m12lrpv
5

Es para interactuar :), para que pueda interactuar entre cosas, es útil cuando tiene

  • múltiples implementaciones de las mismas cosas
  • cuando aplica una interfaz a varias clases diferentes porque necesita algún tipo de convención de que estas clases pueden hacer algunas cosas o tener alguna funcionalidad
Omu
fuente
3

Aquí está la vista de alto nivel ...

Las interfaces juegan un papel importante en el concepto de ocultación de información .

Básicamente, te ayudan a ocultar los detalles de implementación de tu clase para que una clase de llamada no dependa de esa implementación. Por lo tanto, al usar interfaces, puede modificar la implementación sin cambiar la clase de llamada. Todo esto a su vez limita la complejidad de su código y facilita su mantenimiento a largo plazo.

Cuando comencé a comprender las interfaces, me las explicaron como un "contrato que proporciona una descripción de su clase". No estoy seguro de si eso le ayudará, pero si piensa en una interfaz para un automóvil, podría decir que conduce , se rompe y gira . Entonces, siempre que me lleve del punto A al punto B, realmente no tengo que saber cómo se implementan esas funciones.

matt_dev
fuente
2

La razón principal por la que las interfaces se utilizan en lenguajes como C # / Java es porque esos lenguajes no admiten la herencia múltiple (de clases) (consulte ¿Cuál es el problema exacto con la herencia múltiple? ).

Pero se permite la implementación múltiple (interfaz), lo que permite que las clases se utilicen de diferentes maneras.

Catalin DICU
fuente
1
Las interfaces en lenguajes administrados NO reemplazan la herencia múltiple. E, incluso en lenguajes que admiten herencia múltiple, el concepto de una interfaz sin implementación es relevante y útil. (Ver inyección de dependencia.)
aridlehoover
1
-1 no muy bien pensado, o realmente no entiendes C # o Java?
John Saunders
Todo lo que quiero decir es que en C ++ se pueden usar clases abstractas puras en lugar de interfaces. La mayoría de las cosas que puede hacer en Java / C # con interfaces que puede hacer en C ++ con clases abstractas puras. En C ++, si quisieras que una clase tuviera múltiples comportamientos, heredarías múltiples clases abstractas puras. Pero no puede hacer eso en Java / C #. No estoy diciendo que las interfaces no sean "útiles", estoy diciendo más que eso: lenguajes como Java & C # no serían realmente lenguajes de programación orientados a objetos sin la herencia de múltiples interfaces. (no permiten herencia de clases múltiples ni mixins)
Catalin DICU
1
+1 Esto es esencialmente lo que se ha descubierto por las malas gracias a la experiencia de C # y Java. Si intenta simplificar evitando la herencia múltiple, simplemente crea complejidad en otra parte. Debido a la falta de un enfoque subyacente unificador, termina con una complejidad peor. Vea la anotación de Krzystof Cwalina en C # Programming Language 3rd Edition , 1.9 Interfaces, que dice exactamente esto. A partir de ahora, todavía hay problemas sin resolver en C # y Java que tendrían soluciones simples si se permitiera la herencia múltiple de clases.
Daniel Earwicker
-1 La herencia y las interfaces son realmente muy diferentes.
Kenny
2

Las interfaces son algo incómodas. Apoyan el diseño por contrato con solo creer que el mismo nombre y la interfaz implementada significan el mismo comportamiento. Esto solo funciona gracias a la documentación de la API, debe ser verificado por humanos. Eso hace que las interfaces sean demasiado débiles. Una forma de evitar eso podría ser especificaciones formales. Por otro lado, las interfaces son demasiado fuertes, demasiado estrictas. No se pueden desarrollar interfaces que a menudo se interponen en el camino de la reutilización. Esto se resuelve mediante protocolos: mecanismo en lenguajes dinámicos, que envían mensajes (métodos de llamada) y cuando ese mensaje no es compatible con el receptor, se llama a la devolución de llamada estándar. Tener protocolos concretos con limitaciones sería mejor en mi humilde opinión.

Gabriel Ščerbák
fuente
1

Piense en el control remoto ...

Hay un cliente y un servidor involucrados aquí. Digamos que están físicamente separados por Internet. El cliente está llamando a un método cuya ejecución real ocurre en el servidor. Desde la perspectiva del cliente, el cliente no sabe nada sobre el objeto en el servidor que realiza la ejecución. Sin embargo, sabe qué método llamar. Porque mientras construimos el programa del cliente, solo estamos expuestos a una interfaz (o contrato). No estamos expuestos a todo el objeto que vive en el servidor. Intente hacer algunas aplicaciones de demostración en .net remoting y averiguará el resto. Feliz programación.

deostroll
fuente
0

¿Por qué usamos interfaces?

Algunos lenguajes implementan llamadas a métodos polimórficos usando vtables y descartan la mayor parte de la información de tipo, lo que dificulta no definir interfaces.

Entonces, a veces simplemente usamos interfaces porque el diseño del lenguaje lo requiere.

Alex Jasmin
fuente
0

Al comenzar con una interfaz, puede implementar un proxy , lo que permite una carga diferida o realizar algunas verificaciones al llamar a los métodos de una implementación concreta.

lmsasu
fuente
0

La interfaz separa el tipo de datos de la lógica de implementación.

Anand
fuente
0

La interfaz proporciona un prototipo de modal que solo contiene la declaración de funcionalidad de un comportamiento específico.

y si desea implementar este comportamiento en la clase, entonces debe implementar esta interfaz en la clase, entonces la clase tiene esta funcionalidad de comportamiento o puede tener un comportamiento múltiple.

porque la clase puede implementar múltiples interfaces.

Manoj Gupta
fuente