OO è solitamente "definito" in termini di quattro requisiti di base:
-
Abstraction significa che sei in grado di separare un comportamento esternamente visibile dagli oggetti dalla sua implementazione.
-
Incapsulamento significa essere in grado di nascondere i dettagli dell'implementazione di un oggetto (così strettamente correlato all'astrazione che alcuni autori li trattano come uno solo, lasciando solo tre requisiti principali).
-
Modularità significa poter impacchettare le astrazioni in unità discrete.
-
Gerarchia è una classifica o ordinamento di astrazioni: una capacità di definire la relazione tra un'astrazione e l'altra.
Io, per esempio, considererei un oggetto orientato alla lingua se supporta questi quattro requisiti principali. I supporti, tuttavia, vanno un po 'oltre "consente" o "tollerano".
C, ad esempio, offre una flessibilità sufficiente per poter simulare ciascuno di questi abbastanza bene. C, tuttavia, fornisce solo un piccolo supporto per l'astrazione o la modularità, e nessuna per l'incapsulamento o la gerarchia - puoi fare queste cose se vuoi abbastanza male, ma il linguaggio non fornisce alcun supporto diretto per loro.
C ++, per un confronto ovvio fornisce supporto diretto per ciascuno di questi requisiti. Ad esempio, l'incapsulamento è direttamente supportato rendendo i membri della classe privati e / o protetti e le gerarchie sono supportate tramite l'ereditarietà delle classi.
Questo non è ancora quello che normalmente si chiamerebbe un linguaggio "puro" orientato agli oggetti. In un linguaggio OO puro (ad esempio Smalltalk), non si ottiene solo il supporto per la gerarchia, ma si ottiene una gerarchia predefinita di tipi e si deve definire la relazione di qualsiasi nuovo tipo con un tipo esistente in tale gerarchia (ad es. , tutto il tuo codice si trova nelle classi e ogni classe deve derivare da una esistente).
Sebbene le classi e l'ereditarietà siano comuni a molte implementazioni dell'orientamento agli oggetti, non è nemmeno necessario. Ad esempio, Self e JavaScript utilizzano entrambi gerarchie basate su esempi. Invece di una gerarchia di classi, con ogni oggetto un'istanza di una classe, questi usano solo una gerarchia di oggetti, ciascuno basato su qualche altro oggetto, ma modificato in qualche grado arbitrario.