Existem dois conceitos principais em confusão: encadernação e carregamento. É conflitado pelo conceito de DataBinding, que está em algum lugar no meio frequentemente fazendo as duas coisas. Depois de considerar, vou acrescentar mais um conceito, para completar a trifecta, despacho.
Tipos
Associação tardia : o tipo é desconhecido até que a variável seja exercida durante o tempo de execução; geralmente através de atribuição, mas existem outros meios para coagir um tipo; linguagens de tipo dinâmico chamam isso de recurso subjacente, mas muitas linguagens de tipo estaticamente têm algum método para obter ligação tardia
Implementado frequentemente usando tipos dinâmicos [especiais], introspecção / reflexão, sinalizadores e opções do compilador, ou através de métodos virtuais, emprestando e estendendo o envio dinâmico
Ligação antecipada : o tipo é conhecido antes que a variável seja exercida durante o tempo de execução, geralmente por meios declarativos estáticos
Implementado frequentemente usando tipos primitivos padrão
Funções
Envio estático : função ou sub-rotina conhecida, específica no momento da compilação; é inequívoco e corresponde à assinatura
Implementado como funções estáticas; nenhum método pode ter a mesma assinatura
Despacho dinâmico : não é uma função ou sub-rotina específica em tempo de compilação; determinado pelo contexto durante a execução. Existem duas abordagens diferentes para o "envio dinâmico", distinguidas pelas informações contextuais usadas para selecionar a implementação da função apropriada.
No único [ dinâmico ] expedição , apenas o tipo da instância é utilizada para determinar a implementação da função apropriada. Nas linguagens de tipo estaticamente, o que isso significa na prática é que o tipo de instância decide qual implementação de método é usada, independentemente do tipo de referência indicado quando a variável é declarada / atribuída. Como apenas um único tipo - o tipo da instância do objeto - é usado para inferir a implementação apropriada, essa abordagem é chamada "despacho único".
Também há vários despachos [ dinâmicos ] , nos quais os tipos de parâmetros de entrada também ajudam a determinar qual implementação de função chamar. Como vários tipos - tanto o tipo da instância quanto o (s) tipo (s) do (s) parâmetro (s) - influenciam qual implementação de método é selecionada, essa abordagem é chamada de "despacho múltiplo".
Implementado como funções virtuais ou abstratas; outras pistas incluem métodos substituídos, ocultos ou sombreados.
NB: Se a sobrecarga de método envolve ou não despacho dinâmico, é específica do idioma. Por exemplo, em Java, os métodos sobrecarregados são enviados estaticamente.
Valores
Carregamento lento : estratégia de inicialização de objetos que adia a atribuição de valor até que seja necessário ; permite que um objeto esteja em um estado essencialmente válido, mas intencionalmente incompleto, e aguarde até que os dados sejam necessários antes de carregá-lo; geralmente é particularmente útil para carregar grandes conjuntos de dados ou aguardar recursos externos
Implementado frequentemente por propositalmente não carregar uma coleção ou lista em um objeto composto durante as chamadas de construtor ou inicialização até que algum chamador downstream solicite para ver o conteúdo dessa coleção (por exemplo, get_value_at, get_all_as, etc). As variações incluem carregar meta informações sobre a coleção (como tamanho ou chaves), mas omitir os dados reais; também fornece um mecanismo para alguns tempos de execução para fornecer aos desenvolvedores um esquema de implementação de singleton bastante seguro e eficiente
Carregamento Ansioso : estratégia de inicialização do objeto que executa imediatamente todas as atribuições de valor para que todos os dados precisem ser concluídos antes de se considerar em um estado válido.
Implementado frequentemente fornecendo aos objetos compostos todos os dados conhecidos o mais rápido possível, como durante uma chamada ou inicialização do construtor
Ligação de dados : geralmente envolve a criação de um link ou mapa ativo entre dois fluxos de informações compatíveis, para que as alterações em um sejam refletidas de volta no outro e vice-versa; para serem compatíveis, eles geralmente precisam ter um tipo de base ou interface comum
Implementado frequentemente como uma tentativa de fornecer uma sincronização mais limpa e consistente entre os diferentes aspectos do aplicativo (por exemplo, modelo de exibição para exibição, modelo para controlador etc.) e fala sobre conceitos como origem e destino, pontos de extremidade, ligação / desativação, atualização e eventos como on_bind, on_property_change, on_explicit, on_out_of_scope
NOTA DE EDIÇÃO: Última edição principal para fornecer uma descrição de exemplos de como isso ocorre com frequência. Exemplos de código específicos dependem inteiramente da implementação / tempo de execução / plataforma