O pato está digitando um subconjunto de polimorfismo


17

Do polimorfismo no WIkipedia

Na ciência da computação, o polimorfismo é um recurso da linguagem de programação que permite que valores de diferentes tipos de dados sejam manipulados usando uma interface uniforme.

De duck digitando na Wikipedia

Na programação de computadores com linguagens de programação orientadas a objetos, a tipagem de pato é um estilo de tipagem dinâmica, no qual o conjunto atual de métodos e propriedades de um objeto determina a semântica válida, em vez de sua herança de uma classe específica ou implementação de uma interface específica.

Minha interpretação é que, com base na digitação do pato, os métodos / propriedades dos objetos determinam a semântica válida. Significa que a forma atual dos objetos determina a interface que ele mantém.

No polimorfismo, você pode dizer que uma função é polimórfica se aceitar vários tipos de dados diferentes, desde que mantenha uma interface.

Portanto, se uma função puder digitar o tipo, ela poderá aceitar vários tipos de dados diferentes e operar com eles, desde que esses tipos de dados possuam os métodos / propriedades corretos e, assim, mantenham a interface.

(O uso do termo interface não é uma construção de código, mas mais uma construção descritiva e documentadora)

  • Qual é a relação correta entre tipificação e polimorfismo?
  • Se um idioma pode digitar, significa que ele pode fazer polimorfismo?

1
Não tenho certeza do que você está procurando em uma resposta. Você definiu os dois com precisão, para ter uma resposta definitiva, tanto quanto possível. Decidir se a digitação do pato "conta" como polimorfismo é mais ou menos uma questão filosófica, ou talvez uma questão de terminologia, se você quer que seja assim. Então, o que você procuraria em uma resposta?
Psr

@ psr Eu estava basicamente dizendo "aqui está como eu a interpreto. Estou errado? Estou certo? Existem acadêmicos repugnantes que dizem isso de uma maneira ou de outra. Existem artigos sobre o assunto?" Basicamente em detalhes, exceto a "tipagem de pato é uma implementação / subconjunto de polimorfismo" o que mais pode ser dito sobre o relacionamento?
Raynos

até onde eu entendo, a homografia faz com que a digitação com patos seja outra coisa, além de interface uniforme => não um polimorfismo, ou pelo menos não no sentido de como a Wikipedia o define. Eg door.close()etiger.close()
gnat

4
A tipagem de pato é um caso de polimorfismo Ad-hoc . Você está pensando demais nisso.
yannis

Respostas:


16

Eu digo que o polimorfismo é uma característica genérica, que pode ser implementada de várias maneiras:

  • herança baseada em classe.
  • objetos baseados em protótipo (com ou sem herança)
  • digitação de pato
  • conformidade de interface (como feito pelas interfaces da Go e implicitamente nos modelos C ++)

cada um deles permite que o programador use um único código com tipos diferentes, para que todos incorporem o conceito de polimorfismo.


7

Eu penso isso:

Tanto a tipagem do pato quanto o polimorfismo são meios de indireção / abstração. Polimorfismo é um conceito baseado em tipos e digitação, enquanto a tipagem de pato é baseada em contratos.

Com o polimorfismo, é importante o que é a COISA e não como ela se comporta (seu comportamento pode ser a consequência do que é).

Na digitação de pato, é importante como uma COISA se comporta. A digitação com patos está mais ligada ao conceito de objetos como atores que trocam mensagens, em vez de objetos com algumas propriedades definidas.


2
Isto está errado. O polimorfismo é um enorme guarda-chuva que cobre muitas coisas. Em particular, abrange a digitação de patos. Assim, a tipagem de patos é uma forma de polimorfismo.
Thomas Eding

Discordo. A herança tradicional com métodos comportamentais tem as mesmas características. É apenas mais tipo seguro por ser explícito quanto ao que o comportamento de um objeto é garantida a exibição (o que não exclui outros comportamentos!)
marstato

6

A resposta é SIM .

Duck Typing é um caso especial de digitação dinâmica , e mesmo que a digitação dinâmica por si só não possa ser considerada diretamente como polimorfismo (uma vez que é apenas propriedade da linguagem executar a verificação de tipo no tempo de execução e não no tempo de compilação), as técnicas que geralmente subjacente à tipagem dinâmica, essa ligação tardia e despacho dinâmico são característicos do polimorfismo .


O problema com o artigo da Wikipedia e quantas pessoas usam o termo hoje em dia é que ele não define o que a digitação com pato significava quando o vi pela primeira vez (a saber, uma forma de digitação), mas, ao contrário, ser capaz de invocar métodos e lançar um erro de tempo de execução quando eles não estão definidos. Isso não é digitação, mas a falta de digitação, como Eric Lippert explica .
reinierpost

1

A tipagem de pato não é um subconjunto do polimorfismo, pois o polimorfismo requer explicitação, que é perdida na tipagem de pato. Portanto, a digitação com patos tem a chance de "implementar" uma "interface" não porque faz sentido semântico, mas porque você tem a mesma assinatura. Se a tipagem de pato fosse um subconjunto de polimorfismo, ela teria todas as propriedades do polimorfismo, incluindo declaração explícita.

A digitação com patos também não é realmente uma implementação de polimorfismo, é parte de um sistema de tipos diferente. Geralmente, você associa a digitação de patos a uma linguagem dinâmica que avança e passa uma mensagem a um objeto sem saber se o objeto pode lidar com isso - se for possível, passou efetivamente no teste de digitação de patos. Geralmente, você pensa no polimorfismo como sendo implementado em tempo de compilação configurando vtables (e itable se as interfaces forem diferentes das classes). Mas existem MUITOS idiomas por aí e muitas maneiras de implementar esses recursos.

Até certo ponto, essa é uma questão filosófica. Você pode pensar em digitação de pato como interfaces que são automaticamente declaradas implicitamente? Não consigo pensar em nenhum motivo errado , exatamente, mas não acho que seja provavelmente a maneira mais produtiva de encará-lo. Acho que a tipagem e as interfaces de pato são recursos comumente encontrados nos sistemas de tipos da linguagem de programação, ambos têm maneiras bastante semelhantes de se comportar e são importantes para os programadores entenderem.


6
"polimorfismo requer explicitação", onde diz isso? herança baseada em classe é apenas uma forma de polimorfismo, não a única.
Javier

E continuando o comentário de Javier, que tal polimorfismo ad hoc ?
yannis

@ YannisRizos - O problema de responder a uma pergunta como essa é que existem tantas línguas e tanta terminologia que alguém pode lhe dar uma cutucada, não importa o que você diga. Entendo por que "polimorfismo ad hoc" tem a palavra "polimorfismo" no nome, mas eu argumentaria que é algo além do que o OP quer dizer com "polimorfismo".
Psr

@Javier - Todos os métodos listados requerem explicitação, exceto digitação de patos.
Psr

@ psr Na verdade, eu não ligo para o que OP significa "polimorfismo". Eu não acho que alguém deva se importar, é um conceito científico com uma definição muito simples, não acho que devamos responder com base em nossas próprias interpretações ou no que podemos pensar que é a interpretação dos OPs. Especialmente a interpretação dos OPs, já que ele está solicitando, por padrão, não tem certeza sobre sua interpretação. Eu discordo que é uma pergunta filosófica, a pergunta como afirmada foi científica e com uma resposta simples: Sim, tipagem de patinhos é uma forma de polimorfismo ad hoc, um subconjunto de polimorfismo.
yannis

1

Parece quase natural dizer "Sim, se foo tem digitação de pato, foo tem polimorfismo". Mas não posso dizer isso com 100% de certeza, no sentido de que talvez seja possível criar exemplos artificiais desse sistema que digite pato ("pode ​​grasnar e& pode flutuar na água ==> é um Duck ") embora não tenha polimorfismo (" foo, grasnado! "Falha), mas eles seriam realmente artificiais e no mundo real, eu diria" Sim, se a tipagem de pato estiver presente, o polimorfismo também deve estar presente ".

Pessoalmente, vejo a digitação de pato como "polimorfismo bem feito". O que quero dizer com isso, coisa que existe em um mundo de digitação de patos não precisa ter nenhum tipo explícito e seu comportamento (polimórfico = "mesmo acesso, resultado diferente") é a única coisa que conta. Em outras implementações de polimorfismo, ele é restrito a tipos / interfaces / herança, portanto é "polimorfismo implementado e restrito" e não um "polimorfismo per se".


0

As linguagens de programação com tipo estático permitem verificação anterior de erros, melhor aplicação de estilos de programação disciplinados e geração de código de objeto mais eficiente que as linguagens, nas quais todas as verificações de consistência de tipo são realizadas em tempo de execução.

(B. Pierce e amigos)

Portanto, como você pode observar, nesse aspecto, a digitação com patos é uma digitação dinâmica, uma execução realmente diferente das outras.

Existe algum método para determinar o tipo que se relaciona com a polimorfia, por exemplo, que torna o código mais flexível, mas a digitação com patos é outro problema nesses casos.

Em detalhes, há o cálculo lambda digitado e o cálculo lambda não digitado que ajudam a determinar a propriedade do cálculo e da computação.

Também vejo que coisas como digitar patos podem ajudar se queremos apenas obter um resultado rápido, mas em outras ocasiões também sinto que a natureza dinâmica o torna mais ajustável às necessidades, para que eu possa calcular mais rapidamente. Acho que isso é apenas para dizer, querida, que se eu realmente sei o que quero calcular, digitar é o melhor, mas por que sei o que quero? Hehehe ...

Esses são meus cinco centavos e acho que isso pode criar um tópico de pesquisa interessante.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.