tl; dr: puoi avere ereditarietà senza OO, puoi avere incapsulamento senza OO, puoi avere polimorfismo senza OO, puoi persino avere tutti e tre contemporaneamente senza OO. D'altro canto, puoi avere OO senza ereditarietà. Inoltre, ci sono diversi tipi di incapsulamento (orientato all'ADT e OO), IOW non tutto l'incapsulamento è OO.
Versione lunga:
Il termine "Programmazione orientata agli oggetti" è stato inventato da Alan Kay, quindi decide cosa significhi. E lo definisce in questo modo :
OOP per me significa solo messaggistica, conservazione locale, protezione e occultamento del processo statale ed estremo vincolo tardivo di tutte le cose.
Per quanto riguarda l'implementazione, la messaggistica è una chiamata di procedura in ritardo e se le chiamate di procedura sono in ritardo, non è possibile sapere in fase di progettazione ciò che si intende chiamare, quindi non è possibile fare ipotesi sulla rappresentazione concreta dello stato. Quindi, in realtà si tratta di messaggistica, il late-binding è un'implementazione della messaggistica e l'incapsulamento ne è una conseguenza.
In seguito ha chiarito che " La grande idea è" messaggistica ", e si rammarica di averla definita" orientata agli oggetti "anziché" orientata ai messaggi ", poiché il termine" orientato agli oggetti "pone l'accento sulla cosa non importante (oggetti ) e distrae da ciò che è veramente importante (messaggistica):
Solo un gentile promemoria che ho fatto un po 'di fatica all'ultimo OOPSLA per cercare di ricordare a tutti che Smalltalk NON è solo la sua sintassi o la libreria di classi, non si tratta nemmeno di classi. Mi dispiace di aver coniato molto tempo fa il termine "oggetti" per questo argomento perché molte persone si concentrano sull'idea minore.
La grande idea è "messaggistica" - ecco di cosa si occupa il kernal di Smalltalk / Squeak (ed è qualcosa che non è mai stato del tutto completato nella nostra fase PARC Xerox). I giapponesi hanno una piccola parola - ma - per "ciò che sta in mezzo" - forse l'equivalente inglese più vicino è "interstiziale". La chiave per realizzare sistemi grandi e coltivabili è molto di più per progettare come comunicano i suoi moduli piuttosto che quali dovrebbero essere le loro proprietà e comportamenti interni. Pensa a Internet: per vivere, (a) deve consentire molti diversi tipi di idee e realizzazioni che vanno oltre ogni singolo standard e (b) per consentire vari gradi di interoperabilità sicura tra queste idee.
(Certo, oggi, la maggior parte delle persone non si concentra nemmeno sugli oggetti ma sulle classi, il che è ancora più sbagliato.)
La messaggistica è fondamentale per OO, sia come metafora che come meccanismo.
Se invii a qualcuno un messaggio, non sai cosa ci fanno. L' unica cosa che puoi osservare è la loro risposta. Non sai se hanno elaborato il messaggio da soli (cioè se l'oggetto ha un metodo), se hanno inoltrato il messaggio a qualcun altro (delega / proxy), se lo hanno persino capito. Ecco cos'è l'incapsulamento, questo è OO. Non puoi nemmeno distinguere un proxy dalla realtà, purché risponda a come ti aspetti.
Un termine più "moderno" per "messaggistica" è "invio dinamico del metodo" o "chiamata del metodo virtuale", ma che perde la metafora e si concentra sul meccanismo.
Punti analoghi vengono anche menzionati in On Understanding Data Abstraction, rivisitato da William R. Cook e anche nella sua proposta di definizioni semplificate e moderne di "oggetto" e "oggetto orientato" .
L'invio dinamico delle operazioni è la caratteristica essenziale degli oggetti. Significa che l'operazione da invocare è una proprietà dinamica dell'oggetto stesso. Le operazioni non possono essere identificate staticamente e in generale non è possibile stabilire esattamente quale operazione verrà eseguita in risposta a una determinata richiesta, tranne eseguendola. Questo è esattamente lo stesso delle funzioni di prima classe, che vengono sempre inviate in modo dinamico.
In Smalltalk-72 non c'erano nemmeno oggetti! C'erano solo flussi di messaggi che venivano analizzati, riscritti e reindirizzati. Prima sono arrivati i metodi (metodi standard per analizzare e reindirizzare i flussi di messaggi), successivamente sono arrivati gli oggetti (raggruppamenti di metodi che condividono un certo stato privato). L'eredità è arrivata molto più tardi e le classi sono state introdotte solo come un modo per sostenere l'eredità. Se il gruppo di ricerca di Kay avesse già saputo dei prototipi, probabilmente non avrebbero mai introdotto le classi.
Ogni programmatore dovrebbe leggere Informazioni sull'astrazione dei dati, rivisitato . Spiega in dettaglio quale sia esattamente la differenza tra oggetti e tipi di dati astratti. Fornisce esempi usando Java, e questo è estremamente rilevante per questa domanda, perché sia negli esempi ADT che negli esempi Object usa ereditarietà, incapsulamento e polimorfismo, ma solo uno degli esempi è orientato agli oggetti! In altre parole: puoi avere ereditarietà, incapsulamento e polimorfismo, puoi persino avere tutti e tre contemporaneamente e non avere ancora OO.
D'altra parte, puoi avere OO senza ereditarietà. Come ho accennato in precedenza: le versioni originali di Smalltalk (il linguaggio progettato da Alan Kay, l'inventore del termine "Programmazione orientata agli oggetti") non avevano eredità.
Infine, ma certamente non meno importante, il Trattato di Orlando tratta la delega come alternativa all'eredità e in che modo diverse forme di delega ed eredità portano a diversi punti di progettazione all'interno dello spazio di progettazione di linguaggi orientati agli oggetti. (Si noti che in realtà anche nelle lingue che supportano l'ereditarietà, come Java, alle persone viene effettivamente insegnato ad evitarlo, indicando di nuovo che non è necessario per OO.)