2010-05-19 19 views
76

Ok, un amigo mío va y viene en lo que significa "interfaz" en la programación.Cuál es la definición de "interfaz" en programación orientada a objetos

Cuál es la mejor descripción de una "interfaz".

Para mí, una interfaz es un plano de una clase, ¿es esta la mejor definición?

+1

no es una tontería, pero arroja mucha luz sobre esta pregunta: http://stackoverflow.com/questions/444245/how-will-i-know-when-to-create-an-interface – rmeador

+0

Lo haría dicen que es una palabra genérica, pero aún significa lo mismo para mí. Es como un muro para una entidad particular o una entidad más abstracta que proporciona algunos puntos de entrada al exterior y les da salida sin ningún conocimiento de las operaciones internas. Creo que se puede llamar como una abstracción para definir clases de menor a mayor nivel en OOP. – ikbal

Respuesta

123

Una interfaz es uno de los términos más sobrecargados y confusos en el desarrollo.

En realidad, es un concepto de abstracción y encapsulado. Para una "caja" dada, declara las "entradas" y "salidas" de esa caja. En el mundo del software, eso generalmente significa las operaciones que se pueden invocar en el recuadro (junto con los argumentos) y en algunos casos los tipos de devolución de estas operaciones.

Lo que no hace es que no define cuál es la semántica de estas operaciones, aunque es común (y muy buena práctica) documentarlas en la proximidad de la declaración (por ejemplo, a través de comentarios) o elegir buenas convenciones de nombres Sin embargo, no hay garantías de que se sigan estas intenciones.

Aquí hay una analogía: Eche un vistazo a su televisor cuando está apagado. Su interfaz son los botones que tiene, los diversos enchufes y la pantalla. Su semántica y comportamiento es que toma entradas (por ejemplo, programación por cable) y tiene salidas (pantalla en la pantalla, sonido, etc.). Sin embargo, cuando mira un televisor que no está enchufado, está proyectando su semántica esperada en una interfaz. Por lo que usted sabe, el televisor podría explotar cuando lo conecte. Sin embargo, en función de su "interfaz", puede suponer que no producirá café, ya que no tiene una toma de agua.

En la programación orientada a objetos, una interfaz generalmente define el conjunto de métodos (o mensajes) a los que podría responder una instancia de una clase que tenga esa interfaz.

Lo que se suma a la confusión es que en algunos lenguajes, como Java, hay una interfaz real con su semántica específica del lenguaje. En Java, por ejemplo, es un conjunto de declaraciones de métodos, sin implementación, pero una interfaz también corresponde a un tipo y obedece a varias reglas de tipado.

En otros idiomas, como C++, no tiene interfaces. Una clase en sí misma define los métodos, pero se podría pensar en la interfaz de la clase como las declaraciones de los métodos no privados. Debido a cómo compila C++, obtienes archivos de encabezado donde podrías tener la "interfaz" de la clase sin implementación real. También podría imitar las interfaces de Java con clases abstractas con funciones virtuales puras, etc.

Una interfaz no es ciertamente un modelo para una clase. Un anteproyecto, por una definición, es un "plan de acción detallado". ¡Una interfaz no promete nada sobre una acción! La fuente de la confusión es que en la mayoría de los lenguajes, si tiene un tipo de interfaz que define un conjunto de métodos, la clase que lo implementa "repite" los mismos métodos (pero proporciona definición), por lo que la interfaz parece un esqueleto o un esbozo de la clase.

+0

Estoy leyendo un libro sobre Objective-C y me parece que los autores usan indistintamente los términos "protocolo" e "interfaz". ¿Es correcto decir que "protocolo" e "interfaz" son la misma cosa o me falta algo? – Fazzolini

+1

No usaría la palabra "protocolo" para "interfaz". La palabra "protocolo" implica un nivel de detalle sobre cómo se llevan a cabo las acciones. "Interfaz" es realmente una palabra excelente con una definición puramente inglesa que describe estrictamente qué es exactamente. – OCDev

+0

En Windows, las interfaces de programación se usan bastante ampliamente, por lo que incluso en C++ puede encontrar _ "interfaces" _ de una manera de objetos que están desacoplados de la implementación. – Victoria

26

La interfaz es un contrato que debe cumplir o proporcionar, dependiendo de si usted es un implementador o un usuario.

+5

+1 para el uso de la palabra "contrato" –

+1

En realidad, no me gusta el contrato no calificado aquí, porque un contrato a menudo implica semántica o comportamiento (como en el diseño por contrato). No todas las interfaces implican semántica o comportamiento. Por ejemplo, un "agujero en la pared" es una interfaz del mundo real. Ya sea que perciba esto como una ventana o como un triturador de basura o como cualquier otra cosa, es su interpretación. – Uri

+3

Es cierto. Una interfaz es un "contrato de firma de método", lo que significa que garantiza implementar los métodos dados. No garantiza si lo hace de alguna manera. –

16

No creo que "blueprint" sea una buena palabra para usar. Un plano te dice cómo construir algo. Una interfaz evita específicamente decirle cómo construir algo.

Una interfaz define cómo puede interactuar con una clase, es decir, qué métodos admite.

+3

+1. Una interfaz es la antítesis de un plan. – Pierreten

+1

Creo que el solicitante preguntó qué es una definición y qué no es. :) –

6

Para mí, una interfaz es un plano de una clase, ¿es esta la mejor definición?

No. Un plano incluye típicamente las partes internas. Pero una interfaz es puramente sobre lo que es visible en el exterior de una clase ... o más exactamente, una familia de clases que implementan la interfaz.

La interfaz consiste en las firmas de métodos y valores de constantes, y también un (típicamente informal) "contrato de comportamiento" entre las clases que implementan la interfaz y otras que la usan.

1

Una interfaz separa las operaciones en una clase de la implementación dentro de. Por lo tanto, algunas implementaciones pueden proporcionar muchas interfaces.

La gente generalmente lo describiría como un "contrato" de lo que debe estar disponible en los métodos de la clase.

No es absolutamente un plan, ya que eso también determinaría la implementación. Se podría decir que una definición de clase completa es un modelo.

4

Técnicamente, describiría una interfaz como un conjunto de formas (métodos, propiedades, accesos ... el vocabulario depende del idioma que esté usando) para interactuar con un objeto. Si un objeto admite/implementa una interfaz, puede usar todas las formas especificadas en la interfaz para interactuar con este objeto.

Semánticamente, una interfaz también puede contener convenciones sobre lo que puede o no hacer (por ejemplo, el orden en que puede llamar a los métodos) y sobre lo que, a cambio, puede asumir sobre el estado del objeto dado cómo interactuaste hasta ahora.

1

Una interfaz define qué debe implementar una clase que hereda de ella. De esta forma, múltiples clases pueden heredarse de una interfaz, y debido a que inherticance, puede

  • estar seguros de que todos los miembros de la interfaz se implementan en la clase derivada (incluso si es sólo para lanzar una excepción)
  • abstraer la clase misma de la persona que llama (echar una instancia de una clase a la interfaz, e interactuar con él sin necesidad de saber lo que es la clase derivada real)

para obtener más información, consulte este http://msdn.microsoft.com/en-us/library/ms173156.aspx

1

En mi opinión, la interfaz tiene un significado más amplio que el comúnmente asociado en Java. Definiría "interfaz" como un conjunto de operaciones disponibles con algunas funcionalidades comunes, que permiten controlar/monitorear un módulo.

En esta definición trato de cubrir las interfaces de ambos programas, donde el cliente es un módulo, y las interfaces humanas (GUI, por ejemplo).

Como ya se ha dicho, una interfaz siempre tiene algún contrato detrás de ella, en términos de entradas y salidas. La interfaz no promete nada sobre el "cómo" de las operaciones; solo garantiza algunas propiedades del resultado, dado el estado actual, la operación seleccionada y sus parámetros.

2

Personalmente veo una interfaz como una plantilla.Si una interfaz contiene la definición de los métodos foo() y bar(), entonces sabrá que cada clase que utiliza esta interfaz tiene los métodos foo() y bar().

1

Como arriba, los sinónimos de "contrato" y "protocolo" son apropiados.

La interfaz comprende los métodos y propiedades que puede esperar que una clase exponga.

Así que si una clase implementa la interfaz Cheetos BagChip Bag, usted debe esperar un Cheetos Bag que se comportan exactamente igual que cualquier otra Chip Bag. (Es decir, exponer el método .attemptToOpenWithoutSpillingEverywhere(), etc.)

111

considere la siguiente situación:

Usted está en medio de una habitación grande, vacío, cuando un zombi te ataca de repente.

No tiene armas.

Afortunadamente, un compañero humano está parado en la entrada de la habitación.

"¡Rápido!" le gritas a él. "¡Tírame algo con lo que pueda golpear al zombi!"

Consideremos ahora:
no se hayan indicado (ni qué te importa) exactamente lo su amigo elegirá a tirar;
... Pero no importa, siempre y cuando:

  • Es algo que puede ser lanzados (No se puede tirar el sofá)

  • Es algo que se puede agarrar (Esperemos que no tirar un shuriken)

  • Es algo que se puede utilizar para golpear a los cerebros del zombi hacia fuera (Eso descarta almohadas y tal)

No importa si obtienes un bate de béisbol o un martillo:
, siempre que implemente tus tres condiciones, estás bien.

Para resumir:

Cuando se escribe una interfaz, que está básicamente diciendo: "Necesito algo que ..."

+9

¡Este es el tipo de explicación que a mis alumnos les gusta escuchar! :) – Bazzz

+2

Muy buena explicación para los recién llegados en tierra OOP. ¡Bien hecho! – Rolice

+2

Encuentro esto más comprensible que los demás. aclamaciones. :) – bot

2

Consideremos un hombre (usuario o un objeto) quiere un trabajo por hacer. Se pondrá en contacto con un intermediario (Interfaz) que tendrá un contrato con las empresas (objetos del mundo real creados utilizando clases implementadas). Pocos tipos de trabajos serán definidos por él que las compañías implementarán y le darán resultados. Cada compañía implementará el trabajo a su manera, pero el resultado será el mismo. De esta manera, el usuario realizará su trabajo utilizando una única interfaz. Creo que la interfaz actuará como parte visible de los sistemas con pocos comandos que se definirán internamente mediante la implementación de subsistemas internos.

3

En la Programación, una interfaz define el comportamiento que tendrá un objeto, pero en realidad no especificará el comportamiento. Es un contrato, que garantizará, que cierta clase puede hacer algo.

consideran este pedazo de código C# aquí:

using System; 

public interface IGenerate 
{ 
    int Generate(); 
} 

// Dependencies 
public class KnownNumber : IGenerate 
{ 
    public int Generate() 
    { 
     return 5; 
    } 
} 

public class SecretNumber : IGenerate 
{ 
    public int Generate() 
    { 
     return new Random().Next(0, 10); 
    } 
} 

// What you care about 
class Game 
{ 
    public Game(IGenerate generator) 
    { 
     Console.WriteLine(generator.Generate()) 
    } 
} 

new Game(new SecretNumber()); 
new Game(new KnownNumber()); 

La clase de juego requiere un número secreto. Para probarlo, le gustaría inyectar lo que se usará como un número secreto (este principio se llama Inversion of Control).

La clase de juego quiere ser "de mente abierta" sobre lo que realmente creará el número aleatorio, por lo tanto, pedirá en su constructor "cualquier cosa, que tenga un método Generate".

En primer lugar, la interfaz especifica qué operaciones proporcionará un objeto. Simplemente contiene lo que parece, pero no se proporciona una implementación real. Esta es solo la firma del método. Convencionalmente, en las interfaces C# se agrega el prefijo I. Las clases ahora implementan la interfaz IGenerate. Esto significa que el compilador se asegurará de que ambos tengan un método que devuelva un int y se llame Generate. El juego ahora se llama dos objetos diferentes, cada uno de los cuales implementa la interfaz correcta. Otras clases producirían un error al construir el código.

Aquí me di cuenta de la analogía modelo que utilizó:

Una clase es visto comúnmente como un modelo para un objeto. Una interfaz especifica algo que una clase debe hacer, por lo que se podría argumentar que, de hecho, es solo un modelo para una clase, pero dado que una clase no necesita necesariamente una interfaz, diría que esta metáfora se está rompiendo. Piensa en una interfaz como un contrato. La clase que lo "firme" será legalmente requerida (exigida por la policía del compilador) para cumplir con los términos y condiciones del contrato. Esto significa que tendrá que hacer, lo que se especifica en la interfaz.

Todo esto se debe a la naturaleza estática de algunos de los lenguajes OO, como es el caso de Java o C#. En Python, por otro lado, se usa otro mecanismo:

import random 

# Dependencies 
class KnownNumber(object): 
    def generate(self): 
     return 5 

class SecretNumber(object): 
    def generate(self): 
     return random.randint(0,10) 

# What you care about 
class SecretGame(object): 
    def __init__(self, number_generator): 
     number = number_generator.generate() 
     print number 

Aquí, ninguna de las clases implementa una interfaz. A Python no le importa eso, porque la clase SecretGame simplemente intentará llamar a cualquier objeto que se pase. Si el objeto TIENE un método generate(), todo está bien. Si no es así: ¡KAPUTT! Este error no se verá en tiempo de compilación, pero en tiempo de ejecución, por lo tanto, posiblemente cuando su programa ya esté implementado y en ejecución. C# te avisaría mucho antes de que te acercaras a eso.

La razón por la que se utiliza este mecanismo, ingenuamente, porque en los lenguajes OO, naturalmente, las funciones no son ciudadanos de primera clase. Como puede ver, KnownNumber y SecretNumber contienen SÓLO las funciones para generar un número. Uno realmente no necesita las clases en absoluto. En Python, por lo tanto, uno podría simplemente tirar a la basura y recoger las funciones por sí solas:

# OO Approach 
SecretGame(SecretNumber()) 
SecretGame(KnownNumber()) 

# Functional Approach 

# Dependencies 
class SecretGame(object): 
    def __init__(self, generate): 
     number = generate() 
     print number 

SecretGame(lambda: random.randint(0,10)) 
SecretGame(lambda: 5) 

Un lambda es sólo una función, que fue declarado "en línea, a medida que avanza". Un delegado es el mismo en C#:

class Game 
{ 
    public Game(Func<int> generate) 
    { 
     Console.WriteLine(generate()) 
    } 
}  

new Game(() => 5); 
new Game(() => new Random().Next(0, 10)); 

Los últimos ejemplos no son posibles como este en Java, ya que Java no puede sacudir alrededor con funciones como los otros dos (Python y C#) lata.Allí, las interfaces son su única forma de comportamiento específico de esta manera en av.

0

Definición convencional: una interfaz es un contrato que especifica los métodos que necesita implementar la clase que lo implementa.

La definición de interfaz ha cambiado con el tiempo. ¿Crees que Interface solo tiene declaraciones de métodos? ¿Qué pasa con las variables finales estáticas y las definiciones predeterminadas después de Java 5.

Las interfaces se introdujeron en Java debido al problema Diamante con herencia múltiple y eso es lo que realmente intentan hacer.

Las interfaces son las construcciones que se crearon para salirse con la suya con el problema de herencia múltiple y pueden tener métodos abstractos, definiciones predeterminadas y variables finales estáticas.

http://www.quora.com/Why-does-Java-allow-static-final-variables-in-interfaces-when-they-are-only-intended-to-be-contracts

0

interfaz es "cuál es el trabajo", un método no "cómo". Es un contrato. Al igual que en la cola de prioridad, sabes qué hacer con ella, pero la implementación subyacente no la conoces. La clase acepta nunca cambiar los "efectos" de las operaciones existentes, y el cliente acepta usar la clase estrictamente sobre la base de su interfaz e ignorar cualquier implementación detalles.

Layman por ejemplo .: pensar en tener un control remoto universal que puede controlar cualquier televisor, si eso es un modelo de tubo antiguo o que utiliza una pantalla LCD o de plasma. Presione 2, luego 5, luego Intro, y cualquiera de las pantallas mostrará el canal 25, , aunque el mecanismo para hacerlo es muy diferente dependiendo de en la tecnología subyacente.

Cuestiones relacionadas