Alan Kay, que cunhou a frase programação orientada a objetos, observou aqui e em outros lugares, essa abordagem orientada a objetos programação é mais sobre mensagens do que objetos. A chave é que os programas são projetados como um conjunto de objetos que se comunicam por meio de mensagens (em muitos idiomas, uma mensagem é chamada de chamada de método polimórfica).
Em Smalltalk (a linguagem em que Alan Kay estava trabalhando) quando uma mensagem é enviada para um objeto, o receptor do objeto determina como o objeto responderá. Em uma linguagem baseada em classe, o comportamento típico é:
- Verifique se o objeto tem um método que corresponda à assinatura da mensagem, se assim for, invoque isso.
- Caso contrário, marque (recursivamente) se alguma das classes base do objeto contiver um método que corresponda à assinatura do método. Quando uma classe herda outra classe, isso significa que os métodos da classe base estão disponíveis para os objetos da classe derivada, mas podem ser substituídos para fornecer um comportamento diferente.
No entanto, outras linguagens, como Self e JavaScript, não são objetos de classes. No lugar da herança, um padrão conhecido como delegação é usado. Quando um objeto recebe uma mensagem que não entende, ele pode delegar sua resposta a outro objeto conhecido como protótipo.
Em todos os idiomas mencionados até agora, diferentemente da maioria das linguagens principais, como Java, C ++ e C #, qualquer objeto pode implementar uma mensagem para qualquer mensagem. C ++ derivou um modelo diferente (e mais restritivo) de Simula, onde uma mensagem é definida em uma classe base e pode ser substituída por uma classe derivada, mas nenhuma outra classe pode responder ao método.
Auto-demonstrou, incluindo em imagens de um subsistema Smalltalk, que usando o modelo baseado em protótipos um modelo baseado em classe pode ser implementado como um padrão de programação, então nesse sentido o modelo baseado em protótipos é mais descritivo. O inverso exigiria a implementação de um novo sistema de objetos do zero (por exemplo, uma classe chamada PrototypicalObject, com comportamento totalmente distinto dos objetos normais do Smalltalk).
Em seu núcleo, OOP é sobre objetos e mensagens (chamadas de método), onde vários objetos podem implementar respostas diferentes para a mesma mensagem. Os detalhes de herança e delegação podem ajudar a criar esses objetos, mas são simplesmente variantes do modelo padrão.