La programmazione orientata agli oggetti non riguarda le funzioni di sintassi, è una filosofia di codifica e progettazione. Alla base c'è il concetto di un oggetto , che è un costrutto che i gruppi dichiarano con routine per agire su di esso (o, a seconda del punto di vista, delle risposte ai messaggi). L'altro aspetto importante di OOP è l' incapsulamento : avvolgere i dettagli di implementazione in strutture opache e collegarli attraverso interfacce ben definite. Praticamente tutto il resto nella teoria OOP risale a questi due fondamenti.
Quindi, qualsiasi linguaggio che può in qualche modo modellare oggetti (entità che contengono sia dati che codice) e incapsulamento può essere usato per fare OOP. Ad esempio, in C è possibile utilizzare i puntatori a funzione per memorizzare le funzioni nelle strutture e è possibile utilizzare il file system di intestazione / sorgente per realizzare l'incapsulamento. Non è conveniente, ma è sufficiente fare OOP. Probabilmente puoi anche piegare qualcosa come Haskell o ML nel fare OOP, e non sarei sorpreso se qualcuno potesse escogitare un modo di fare OOP in assemblea.
In pratica, tuttavia, un linguaggio può essere definito "orientato agli oggetti" se fornisce un set completo di funzioni di sintassi per la programmazione esplicita orientata agli oggetti. In genere, ciò significa che un tale linguaggio dovrebbe avere: * una nozione di oggetto * una nozione di metodo di chiamata o passaggio di messaggi * un modo comodo e diretto di controllare l'accesso ai membri dell'oggetto * un modo comodo e semplice di definire le interfacce
Di conseguenza, definirei un pezzo di codice orientato agli oggetti se aderisce ai principi OOP e utilizza la sintassi OOP disponibile.
BTW., Il tuo esempio di codice probabilmente fa uso il polimorfismo e funzioni virtuali, anche se la sintassi C non lo rende evidente. Non sono un esperto di SDL, ma mi aspetto SDL_surface
di essere in grado di rappresentare vari tipi di superfici, ognuna con il proprio set specifico di implementazioni: la fusione di qualcosa su una bitmap di memoria e la fusione su una superficie dello schermo richiedono radicalmente differenti codice, ma l'interfaccia (le funzioni che accettano SDL_surface*
come argomento) rimane la stessa. Proprio così, implementa anche l'incapsulamento: non puoi accedere direttamente alla rappresentazione sottostante di una superficie, devi passare attraverso funzioni che sanno come gestire un SDL_surface
, perché è tutto ciò che hai. È un bell'esempio di come faresti OOP in C.