2010-06-17 16 views

Respuesta

23

El interface como palabra clave y el artefacto se introdujo por Java (C# y lo tomaron de allí) para describir lo que el contrato de un objeto debe adherirse era.

Pero, la interfaz siempre ha sido una parte clave del Paradigma orientado a objetos y, básicamente, representa los métodos que un objeto tiene que responder. Java solo aplica este mecanismo para proporcionar una comprobación estática de tipos.

Por lo tanto, los lenguajes de programación dinámicos (OO) hacen usan interfaces, incluso aunque no las comprueben estáticamente. Al igual que otros tipos de datos, por ejemplo en Rubí:

@i = 1; 

Usted no tiene que declarar i de tipo FixNum sólo lo utilizan. Lo mismo ocurre con las interfaces, simplemente fluyen. La desventaja es que no se puede tener un control estático sobre eso y los fallos solo se muestran en tiempo de ejecución.

Por otro lado Structural type (o el tipo de pato estático como lo llamo: P) utilizado por idiomas como Go o Scala, ofrece lo mejor de ambos mundos.

1. Véase Daniel Earwicker comentario sobre CORBA interface palabra clave

+2

Añadiría un +1 adicional para mencionar el tipado estructural, si pudiera. Es un gran concepto. – RHSeeger

+0

Otro +1 para escribir estructural –

+3

"La interfaz como palabra clave y artefacto fue introducida por Java". No estoy muy seguro de eso. IDL de CORBA (1991) tiene la palabra clave 'interface', y en la versión 2.0 de C++ (1989) una clase con todas las funciones de miembros virtuales puros es semánticamente idéntica a una interfaz. Así que supongo que tal vez Java tomó prestada la palabra clave de CORBA para otorgar especial importancia a la idea de característica del lenguaje tomada de C++. –

0

Las interfaces se utilizan en los lenguajes estáticos para describir que dos objetos independientes "implementan el mismo comportamiento". En los lenguajes de tipado dinámico, uno asume implícitamente que cuando dos objetos tienen un método con el mismo nombre/params, hace lo mismo, por lo que las interfaces no son útiles.

0

En C# y Java, las interfaces son clases abstractas acaba con todos los métodos abstractos. Existen para permitir la herencia pseudo múltiple sin realmente apoyar la herencia múltiple en toda regla y la herencia múltiple genera ambigüedad.

Python es compatible con multiple inheritance y tiene su propia forma de determinar qué método de los padres debe invocarse cuando existe un método en múltiples padres.

+0

"En C# y Java, las interfaces son solo clases abstractas con todos los métodos abstractos". ¡Ah, si eso fuera verdad! http://smellegantcode.wordpress.com/2008/05/22/virtual-properties-in-c/ –

1

Las construcciones de interfaz se utilizan en lenguajes tipados estáticamente para enseñar al sistema de tipos qué objetos son intercambiables entre sí en un contexto particular de llamadas a métodos. Si dos objetos implementan el mismo método pero no están relacionados a través de la herencia de una clase base común o la implementación de una interfaz común, el sistema tipo generará un error en tiempo de compilación si sustituye uno por el otro.

Los idiomas dinámicos utilizan "pato escribiendo", lo que significa que el método simplemente se busca en el tiempo de ejecución y si existe con la firma correcta, se usa; de lo contrario, se generará un error de tiempo de ejecución. Si dos objetos "cuajan como un pato" implementando el mismo método, son sustituibles. Por lo tanto, no existe una necesidad explícita de que el lenguaje los relacione a través de la clase base o la interfaz.

Dicho esto, las interfaces como concepto siguen siendo muy importantes en el mundo dinámico, pero a menudo están definidas en la documentación y no son aplicadas por el lenguaje.Ocasionalmente, veo que los programadores realmente hacen una clase base que esboza la interfaz para este propósito también; esto ayuda a formalizar la documentación, y es de uso particular si parte de la interfaz se puede implementar en términos del resto de la interfaz.

5

Nosotros no requieren ellos, pero nosotros hacemos soporte ellos. Consulte Zope Interfaces (que puede ser y se usa fuera de Zope).

0

lenguajes dinámicos se Pato mecanografiado

Si camina como un pato y grazna como un pato, debe ser un pato

http://en.wikipedia.org/wiki/Duck_typing

En otras palabras, si usted exeject un objeto para soportar el método Delete(), entonces solo puede usar el

obj.Delete() 

método, pero si el objeto no admite Delete() se obtiene un error de tiempo de ejecución. Los lenguajes con torsión estática no lo permiten y arrojan un error de tiempo de compilación. Por lo tanto, básicamente opera de forma segura contra un mayor tiempo de desarrollo y flexibilidad.

Sin interfaces que pueden hacer algo así en lenguas estáticas:

void Save(MyBaseClass item) 
{ 
    if (item.HasChanges) 
     item.Save() 
} 

pero eso requeriría cada objeto que se pasa a este método para heredar de MyBaseClass. Como Java o C# no son compatibles con la herencia de muli, no es muy flexible porque si tu clase ya hereda otra clase, tampoco puede heredar de MyBaseClass. Por lo tanto, la mejor opción sería crear una interfaz ISavable y aceptarla como un parámetro de entrada para garantizar que ese elemento se pueda guardar. Entonces usted tiene lo mejor de ambos: tipo de seguridad y flexibilidad.

public interface ISavable 
{ 
    bool HasChanges {get;set;} 
    void Save(); 
} 

void Save(ISavable item) 
{ 
    if (item.HasChanges) 
     item.Save() 
} 

La última puerta trasera es utilizar objeto como un parámetro si no se puede esperar que cada elemento que va a utilizar el método para guardar para implementar la interfaz.

void Save(object item) 
{ 
    if (item.HasChanges) 
     item.Save() 
} 

Pero de nuevo, que no tienen tiempo de compilación y probablemente obtener un error de ejecución si alguien utiliza su método con una clase incompatibles.

+0

"Los lenguajes dinámicos son Duck Typed". Eso es algo bastante salvaje de decir. No es necesario que sea del todo cierto. –

1

Vale la pena señalar que, al contrario de lo que mucha gente dirá como primera respuesta, las interfaces se pueden utilizar para hacer más que documentar "qué métodos admite una clase". Grzenio toca esto con su frase sobre "implementar el mismo comportamiento". Como ejemplo específico de esto, mira la interfaz de Java Serializable. No implementa ningún método; más bien se usa como un "marcador" para indicar que la clase se puede serializar de forma segura.

Cuando se considera de esta manera, podría ser razonable tener un lenguaje dinámico que use interfaces. Dicho esto, algo parecido a las anotaciones podría ser un enfoque más razonable.

1

Una cosa clave acerca de al menos algunos lenguajes dinámicos que hace que las interfaces explícitas sean más que incómodas es que los lenguajes dinámicos a menudo pueden responder a mensajes (err, "llamadas de método") que no conocen de antemano, incluso haciendo cosas como crear métodos sobre la marcha. La única manera real de saber si un objeto responderá correctamente a un mensaje es enviándole el mensaje.Eso está bien, porque los lenguajes dinámicos consideran que es mejor poder soportar ese tipo de cosas que la comprobación de tipos estáticos; se considera que un objeto es utilizable en un protocolo particular porque es "conocido" poder participar en ese protocolo (por ejemplo, en virtud de estar dado por otro mensaje).

+0

Y por "dado por otro mensaje" me refiero a pasado como argumento a una llamada a método, o devuelto por una llamada a método. –

Cuestiones relacionadas