..
O polimorfismo é uma técnica de programação que permite o uso de partes do código-fonte, mantendo-se inalterada, para gerar em tempo de execução comportamentos.
Criação de código polimórfico tem um significado específico na programação orientada a objeto: significa a criação de uma taxonomia de todas as classes que implementam uma interface.
Então, se, por exemplo, minha interface define um método "getArea", cada classe que irá implementar esta interface terá um método "getArea": isto nos permite escrever métodos polimórficos, métodos que podem mudar a sua execução do algoritmo Dependendo do tipo de objeto que é passado como um argumento.
Polimorfismo nas línguas OOP tradicional
Em Java - mas o mesmo vale para C + + e qualquer outra língua, Orientada a Objetos (OO) concluída, vamos então a mão do caso de Ruby - por exemplo:
interface de IFormaGeometrica
{
vazio getArea ();
}
Triângulo public class IFormaGeometrica
{
@ Override
public int getArea ()
{
return (* this.base this.altezza) / 2;
}
}
Neste caso, definir as IFormaGeometrica interface que afirma que todo objeto que "é" um getArea FormaGeometrica terá um método - como a classe Triangle, que é um FormaGeometrica, tem sua própria implementação de getArea, o que nos permite escrever um programa capaz de calcular a área de qualquer forma geométrica, que se está agora presente no código e que serão implementadas no futuro, sem alterar o código fonte original.
Na verdade, se eu escrever uma calculadora de classe:
Calculadora classe public final
{
public static void main (String [] args)
{
Formulários de coleta <IFormaGeometrica> =
<IFormaGeometrica> New ArrayList ();
forme.add (novo Triangle ());
forme.add (new Quadrado ());
forme.add (novo Pentágono ());
for (IFormaGeometrica g: formulário)
{
System.out.println (g.calcolaArea ());
}
}
}
Isso pode levar como entrada qualquer coleção de formas geométricas, desde que cada objeto na coleção deve implementar a interface de IFormaGeometrica, e que tem essencialmente um método getArea.
Este exemplo em Java é puramente acadêmico: na verdade, provavelmente no construtor de cada classe, que incluirá medidas de entrada dos lados da forma geométrica, a inclinação, e assim por diante.
O objetivo é alcançado: nós escrevemos uma classe que pode imprimir em vídeo a área de qualquer forma geométrica. Repito: este é o código que já foi implementada (como no caso do triângulo), que está a ser implementado no futuro.
Não só: se a implementação do cálculo da área do Triângulo continha um bug, eu posso alterar a classe sem ter que reescrever a Calculadora Triângulo classe. Talvez tenha sido implantado em um servidor que precisa reiniciar toda mudança: neste caso não ter que alterar o código é uma grande vantagem. Mas para além disso, é sempre vantajoso para limitar as partes do código que "a mudança", porque toda mudança traz consigo possíveis bugs. Por outro lado, é uma boa prática de programação sempre saber com certeza quais partes do código que permanecem inalterados.
O que acontece "nos bastidores" é que o compilador garante que todos os objetos no código polimórfico do método principal da calculadora classe implementa a interface. Desta forma, dizem que é uma expressão utilizando a metodologia de projeto por contrato ", o contrato é respeitado."
Se não, se isso está em "formas" têm um objeto de uma classe que não iria implementar IFormaGeometrica um erro em tempo de compilação, ou não conseguem executar o programa, porque o compilador iria perceber o erro.
O polimorfismo em Ruby
Mas o que acontece no Ruby? E "possível em Ruby, o que não é compilado, mas interpretado de linguagem, a escrita métodos polimórficos?
Sim, é certamente possível, mas há uma profunda diferença "filosófica" do que as linguagens OO e compilados, que
podemos descrevê-lo. OO programação em Java e clássico, para estabelecer que um objeto pertence a um tipo particular de objetos (que implementa uma determinada interface) precisam expressamente objeto derivar de uma classe pai: basicamente você precisa usar as técnicas de herança (herança por uma classe, uma classe abstrata ou uma interface).
Seria como dizer: Para determinar se este é um pato na frente de mim, eu tomo o seu DNA e estudo em laboratório para ver se ele é pato.
Em Ruby você estiver usando o "teste de pato" (teste de pato) inventado por James Riley (ver http://en.wikipedia.org/wiki/Duck_typing ):
se ele anda como um pato e grasna como um pato, então é um pato.
(Que, aliás, é o que faz cada um de nós quando vê um pato).
O que isso significa? Isso significa que em Ruby, e mais geralmente em linguagens orientadas a objetos scripting, bem como Python e Perl, há necessidade de especificar a interface, nem relações de herança explícita entre as classes.
O intérprete simplesmente "confiança" que o programador, o método de passos quando um objeto polimórfico que "deve ter" um certo modo, nós realmente temos o.
| |
Ruby e Ruby on Rails (Curso)
Criar aplicações de software e Web com Ruby e RoR. A partir de 39 €. |