Alan Kay, che ha coniato la frase programmazione orientata agli oggetti ha rilevato qui e in altri luoghi, orientato agli oggetti la programmazione riguarda più i messaggi che gli oggetti. La chiave è che i programmi sono progettati come un insieme di oggetti che comunicano attraverso i messaggi (in molte lingue un messaggio viene definito come una chiamata al metodo polimorfico).
In Smalltalk (il linguaggio su cui Alan Kay stava lavorando) quando un messaggio viene inviato a un oggetto, il destinatario dell'oggetto determina come l'oggetto risponderà. In un linguaggio basato su classi, il comportamento tipico è:
- Controlla se l'oggetto ha un metodo che corrisponda alla firma del messaggio, in tal caso invocalo.
- Altrimenti, selezionare (in modo ricorsivo) se una delle classi base dell'oggetto contiene un metodo che corrisponde alla firma del metodo. Quando una classe eredita un'altra classe, significa che i metodi della classe base sono disponibili per gli oggetti della classe derivata, ma possono essere sovrascritti per fornire un comportamento diverso.
Tuttavia, altri linguaggi come Self e JavaScript, oggetti non sono istanze di classi. Al posto dell'ereditarietà, viene utilizzato un modello noto come delega. Quando un oggetto riceve un messaggio che non capisce, può delegare la sua risposta a un altro oggetto noto come prototipo.
In tutte le lingue menzionate finora, a differenza della maggior parte dei linguaggi tradizionali come Java, C ++ e C #, qualsiasi oggetto può implementare un messaggio per qualsiasi messaggio. C ++ ha derivato un modello diverso (e più restrittivo) da Simula, in cui un messaggio è definito su una classe base e può essere sovrascritto da una classe derivata, ma nessun'altra classe può rispondere al metodo.
Auto dimostrato, includendo in immagini un sottosistema Smalltalk, che usando il modello basato su prototipo un modello basato su classi può essere implementato come un modello di programmazione, quindi in questo senso il modello basato su prototipo è più descrittivo. L'inverso richiederebbe l'implementazione di un nuovo sistema di oggetti da zero (ad esempio una classe chiamata PrototypicalObject, con un comportamento completamente diverso dai normali oggetti Smalltalk).
Al centro, OOP riguarda oggetti e messaggi (chiamate ai metodi), in cui vari oggetti possono implementare risposte diverse allo stesso messaggio. I dettagli dell'ereditarietà e delega possono aiutare a creare quegli oggetti, ma sono semplicemente varianti del modello standard.