¿Está el pato escribiendo un subconjunto de polimorfismo?


17

Del polimorfismo en WIkipedia

En informática, el polimorfismo es una característica del lenguaje de programación que permite manejar valores de diferentes tipos de datos utilizando una interfaz uniforme.

De pato escribiendo en Wikipedia

En la programación de computadoras con lenguajes de programación orientados a objetos, la escritura de pato es un estilo de escritura dinámica en el que el conjunto actual de métodos y propiedades de un objeto determina la semántica válida, en lugar de su herencia de una clase particular o implementación de una interfaz específica.

Mi interpretación es que, basándose en el tipeo de los patos, los métodos / propiedades de los objetos determinan la semántica válida. Lo que significa que la forma actual de los objetos determina la interfaz que mantiene.

A partir del polimorfismo, puede decir que una función es polimórfica si acepta múltiples tipos de datos diferentes siempre que mantengan una interfaz.

Entonces, si una función puede eludir el tipo, puede aceptar múltiples tipos de datos diferentes y operar en ellos siempre y cuando esos tipos de datos tengan los métodos / propiedades correctos y así mantener la interfaz.

(El uso del término interfaz no se entiende como una construcción de código sino más bien como una construcción descriptiva y documentadora)

  • ¿Cuál es la relación correcta entre ducktyping y polimorfismo?
  • Si un idioma puede esquivar el tipo, ¿significa que puede hacer polimorfismo?

1
No estoy seguro de lo que está buscando en una respuesta. Definió ambos con precisión, por lo que tiene tanta respuesta definitiva como la hay. Decidir si la escritura del pato "cuenta" como polimorfismo es más o menos una pregunta filosófica, o tal vez una pregunta de terminología si lo dices de esa manera. Entonces, ¿qué estarías buscando en una respuesta?
psr

@psr Básicamente decía "así es como lo interpreto. ¿Estoy equivocado? ¿Estoy en lo correcto? ¿Hay personas académicas de renombre que lo dicen de una forma u otra. ¿Hay algún artículo sobre el tema?" Básicamente en detalle, aparte de "escribir pato es una implementación / subconjunto de polimorfismo", ¿qué más se puede decir sobre la relación?
Raynos

Por lo que yo entiendo, la homografía hace que el pato escriba algo más que una interfaz uniforme => no un polimorfismo, o al menos no en el sentido de cómo Wikipedia lo define. Por ejemplo, door.close()ytiger.close()
el mosquito

44
La tipificación de patos es un caso de polimorfismo ad-hoc . Estás pensando demasiado en esto.
Yannis

Respuestas:


16

Digo que el polimorfismo es un rasgo genérico, que se puede implementar de varias maneras:

  • herencia basada en clases.
  • objetos basados ​​en prototipos (con o sin herencia)
  • pato escribiendo
  • cumplimiento de la interfaz (como lo hacen las interfaces de Go e implícitamente en las plantillas de C ++)

cada uno de ellos permite al programador usar un solo código con diferentes tipos, por lo que todos encarnan el concepto de polimorfismo.


7

Creo que:

Tanto la tipificación de patos como el polimorfismo son medios de indirección / abstracción. El polimorfismo es un concepto basado en tipos y tipificación, mientras que la tipificación de pato se basa en contratos.

Con el polimorfismo es importante qué es la COSA y no cómo se comporta (su comportamiento puede ser la consecuencia de lo que es).

En la escritura de patos es importante cómo se comporta una COSA. La escritura de pato está más ligada al concepto de objetos como actores que intercambian mensajes, en lugar de objetos que tienen algunas propiedades definidas.


2
Esto está mal. El polimorfismo es un gran paraguas que cubre muchas cosas. En particular, cubre la escritura del pato. Por lo tanto, la tipificación de patos es una forma de polimorfismo.
Thomas Eding

Estoy en desacuerdo. La herencia tradicional con métodos de comportamiento tiene los mismos rasgos. Es sólo un tipo seguro por ser más explícito en cuanto a comportamiento de un objeto lo que se garantiza que exhiben (lo que no excluye otros comportamientos!)
marstato

6

La respuesta es .

Duck Typing es un caso especial de tipeo dinámico , e incluso si el tipeo dinámico per se no puede considerarse directamente como polimorfismo (ya que es solo la propiedad del lenguaje realizar una verificación de tipo en tiempo de ejecución en lugar de en tiempo de compilación), las técnicas que generalmente subyacente a la tipificación dinámica, tal enlace tardío y despacho dinámico son característicos del polimorfismo .


El problema con el artículo de Wikipedia y cuántas personas usan el término hoy en día es que no define lo que significaba escribir pato cuando lo vi por primera vez (es decir, una forma de escribir), sino que es capaz de invocar métodos y lanzar un error de tiempo de ejecución cuando no están definidos. Eso no es escribir, sino la falta de escritura, como explica Eric Lippert .
reinierpost

1

La tipificación de patos no es un subconjunto del polimorfismo, ya que el polimorfismo requiere de forma explícita, que se pierde en la tipificación de patos. Por lo tanto, la escritura de pato tiene la posibilidad de "implementar" una "interfaz" no porque tenga sentido semántico sino porque tiene la misma firma. Si la tipificación de patos fuera un subconjunto de polimorfismo, entonces tendría todas las propiedades del polimorfismo, incluida la declaración explícita.

La escritura de pato tampoco es realmente una implementación del polimorfismo, es parte de un sistema de tipos diferente. Por lo general, asocia la escritura de pato con un lenguaje dinámico que sigue adelante y pasa un mensaje a un objeto sin saber si el objeto puede manejarlo; si puede, ha pasado efectivamente la prueba de escritura de pato. Por lo general, piensa que el polimorfismo se implementa en tiempo de compilación configurando vtables (y que se puede hacer funcionar si las interfaces son diferentes a las clases). Pero hay MUCHOS idiomas por ahí y muchas formas de implementar estas características.

Hasta cierto punto, esta es una pregunta filosófica. ¿Puedes pensar en la escritura de pato como interfaces que se declaran automáticamente implícitamente? No puedo pensar en ninguna razón que esté mal , exactamente, pero no creo que sea probablemente la forma más productiva de verlo. Creo que la escritura y las interfaces de pato son características comunes de los sistemas de tipos de lenguaje de programación, ambas tienen formas de comportamiento bastante similares, y ambas son importantes para que los programadores las entiendan.


66
"el polimorfismo requiere explicidad" ¿dónde lo dice? La herencia basada en clases es solo una forma de polimorfismo, no la única.
Javier

Y continuando el comentario de @ Javier, ¿qué tal el polimorfismo ad hoc ?
Yannis

@YannisRizos: el problema al responder una pregunta como esta es que hay tantos idiomas y tanta terminología que alguien podría molestarte sin importar lo que digas. Entiendo por qué "polimorfismo ad hoc" tiene la palabra "polimorfismo" en el nombre, pero diría que es algo más que lo que el OP significa "polimorfismo".
psr

@Javier: todos los métodos que enumeró requieren carácter explícito, excepto la escritura de pato.
psr

@psr En realidad no me importa lo que OP quiere decir con "polimorfismo". No creo que a nadie le importe, es un concepto científico con una definición muy simple, no creo que debamos responder con base en nuestras propias interpretaciones o lo que podamos pensar que es la interpretación de los OP. Especialmente la interpretación de los OP, ya que lo pregunta por defecto, no está seguro de su interpretación. No estoy de acuerdo en que es una pregunta filosófica, la pregunta como se dijo fue científica con una respuesta simple: sí, el tipo de pato es una forma de polimorfismo ad hoc, un subconjunto de polimorfismo.
Yannis

1

Se siente casi natural decir "Sí, si el foo tiene tipeo de pato, el foo tiene polimorfismo". Pero no puedo decir esto 100% seguro, en el sentido de que tal vez sea posible encontrar ejemplos artificiales de dicho sistema que tenga tipificación de pato ("puede graznar && puede flotar en el agua ==> es un Duck ") mientras no tiene polimorfismo (" foo, quack! "Falla), pero realmente serían artificiales y en un mundo real, diría" Sí, si la tipificación de patos está presente, el polimorfismo también debe estar presente ".

Personalmente, veo a los patos escribiendo como "polimorfismo bien hecho". Lo que quiero decir con eso es que lo que existe en un mundo de tipeo de pato no necesita tener ningún tipo explícito y su comportamiento (polimórfico = "mismo acceso, diferente resultado") es lo único que cuenta. En otras implementaciones de polimorfismo, está restringido a tipos / interfaces / herencia, por lo que es "polimorfismo implementado y restringido", no un "polimorfismo per se".


0

Los lenguajes de programación de tipo estático permiten una verificación de errores más temprana, una mejor aplicación de estilos de programación disciplinados y la generación de un código objeto más eficiente que los lenguajes donde todas las verificaciones de consistencia de tipo se realizan en tiempo de ejecución.

(B. Pierce y amigos)

Entonces, como puede observar, a este respecto, la escritura de pato es una escritura dinámica que, de lo contrario, realmente se ejecuta.

Hay algún método para determinar el tipo que se relaciona con el polimorfismo, por ejemplo, que hace que el código sea más flexible, pero la tipificación de pato es otro problema en estos casos.

En detalles, hay cálculo lambda con tipo y cálculo lambda sin tipo que ayudan a determinar la propiedad de cálculo y cálculo.

También veo que cosas como escribir pato pueden ayudar si solo queremos obtener un resultado rápido, pero en otras ocasiones también siento que la naturaleza dinámica lo hace más ajustable a las necesidades, por lo que puedo calcular más rápido. Supongo que eso es solo para decir, querida, que si realmente sé lo que quiero calcular, escribir es lo mejor, pero ¿por qué sé lo que quiero? Jejeje ...

Esos son mis cinco centavos y supongo que eso puede ser un tema de investigación interesante.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.