O que é ligação dinâmica?
Na ciência da computação, a associação de nomes é a associação de um identificador, como uma função ou nome de variável, a uma seção de código ou dados. No cenário mais comum, ligação estática, esse mapeamento é conhecido em tempo de compilação. Na ligação dinâmica, o objeto mapeado por uma função não é conhecido no tempo de compilação e pode ser determinado apenas durante o tempo de execução do programa. Por esse motivo, a ligação dinâmica também é chamada de ligação tardia. Embora a ligação dinâmica ofereça flexibilidade não disponível na ligação estática, ela também implica mais custos de desempenho que a ligação estática.
A ligação dinâmica está intimamente relacionada ao polimorfismo, que faz parte da programação orientada a objetos. O polimorfismo permite que o mesmo nome de método seja implementado de maneiras diferentes. Se o código não for gravado de forma que o método preciso não possa ser determinado em tempo de compilação, a ligação dinâmica deverá ser usada.
Por exemplo, uma classe "Shape" pode ter um método chamado "GetArea", porque cada forma tem uma área. Uma subclasse "Circle" de "Shape", no entanto, implementaria "GetArea" de maneira diferente da subclasse "Square". Portanto, se um novo objeto for criado do tipo "Shape" e se o código chamar o método "GetArea" nessa forma, o compilador não terá como saber se a forma acabará sendo um círculo ou um quadrado e, portanto, não saberá qual método GetArea chamar. Este é um exemplo de ligação dinâmica, porque o método GetArea correto será mapeado apenas em tempo de execução, depois que o programa souber que tipo de forma o objeto é.
A ligação dinâmica permite a flexibilidade de usar métodos abstratos sem saber qual implementação específica será usada. No exemplo "Forma", o código pode ser gravado para evitar a ligação dinâmica usando explicitamente esta lógica: Se a forma for um círculo, chame o método GetArea do círculo; caso contrário, se a forma for um quadrado, chame o método GetArea específico para quadrados. O benefício da ligação dinâmica é que o código é mais limpo e mais sustentável do que a alternativa. No exemplo de ligação estática, há duplicação de código e o código deve ser atualizado sempre que um novo tipo de forma for adicionado.
As desvantagens da ligação dinâmica são desempenho e segurança. Na ligação estática, o compilador sabe exatamente qual código chamar e pode otimizar o código para executar com mais eficiência. A segurança de tipo pode ser um problema porque, em algumas implementações de ligação dinâmica, um método pode ser chamado em um objeto que não suporta o método. Por exemplo, o método "GetArea" pode ser chamado em um objeto que não é uma forma e, portanto, não possui um método "GetArea", o que pode resultar em um erro em tempo de execução. A ligação estática impediria esse cenário, gerando um erro de compilação.