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?
door.close()
etiger.close()
Respostas:
Eu digo que o polimorfismo é uma característica genérica, que pode ser implementada de várias maneiras:
cada um deles permite que o programador use um único código com tipos diferentes, para que todos incorporem o conceito de polimorfismo.
fonte
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.
fonte
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 .
fonte
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.
fonte
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".
fonte
(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.
fonte