Incapsulazione, ereditarietà e polimorfismo

29/11/2005

La programmazione orientata agli oggetti prevede l'esistenza di tre componenti fondamentali che caratterizzano profondamente ogni aspetto di questa metodologia differenziandola dall'approccio procedurale, stiamo parlando di: incapsulazione, ereditarietà e polimorfismo. Parliamo di concetti estranei a chi fino ad ora non ha mai digitato listati secondo la logica OOP, cercheremo quindi di analizzarli singlarmente provando a coglierne le specificità.

Il concetto di incapsulazione si ricollega alla possibilità di rendere "invisibili" in sede di scrittura del codice determinati dettagli ricollegati allo sviluppo di una classe specifica; il risultato ottenuto sarà quindi quello di impedire l'accesso ai dettagli interessati da parte di porzioni di codice esterni non ricompresi nell'insieme in oggetto.
Dal punto di vista degli oggetti, in virtù del fatto che questi ultimi interagiscono fra loro tramite i messaggi e i metodi, il loro interscambio sarà reso più agevole dalla possibilità di celare alcuni dettagli; infatti, al momento della stesura del listato non si avrà la necessità di conoscere come un certo oggetto è stato realizzato, basterà avere a disposizione i metodi e le proprietà di cui è portatore. Quindi, tramite l'incapsulazione abbiamo la possibiltà di creare scripts più "leggeri" in termini di numero di righe di codice.

L'incapsulazione, crea una gerarchia tra i soggetti utilizzatori in grado di accedere all'applicativo. Ad esempio, sarà possibile celare gli attributi relativi agli oggetti di una classe permettendo all'utente unicamente l'accesso ai metodi.
Per fare un esempio, pensiamo ad una sala giochi, chiunque può entrare e divertirsi con i videogames attraverso le modalità di gioco proposte, pagando ne avrà il pieno utilizzo ma non potrà certo modificare alcun gioco secondo le sue preferenze.

Quando vengono celati gli attributi degli oggetti di una classe, i metodi appartenenti ad essa sono rappresentati per mezzo di un'interfaccia; con il termine interfaccia intendiamo un collegamento che funge da mediatore tra gli oggetti con lo scopo di trasferire dati da un oggeto all'altro; per mezzo di questo medium l'utilizzatore avrà la possibilità di operare con le proprietà sulla base dei metodi disponibili.

Per quanto riguarda il concetto di ereditarità, con essa si configura un processo mirato alla creazione di gerarchie interne alle classi, grazie ad esso saranno maggiori le opportunità di riutilizzare porzioni del listato alla base di un applicativo.
Per mezzo dell'ereditarietà, potremo concepire una classe principale o generale, che chiameremo classe base oppure superclasse, con la funzione di definire le particolarità di uno specifico insieme di oggetti. La classe generale potrà quindi essere ereditata da delle classi secondarie o sottoclassi, chiamate anche classi derivate, che incrementeranno la classe base tramite i loro specifici elementi. Qunidi, a loro volta, le classi secondarie rappresenteranno delle superclassi per quelle successive protraendo la scala gerarchica.

Una classe derivata, "figlia" della principale, incorpora per definizione ogni informazione e ogni proprietà della classe base ereditata e, questo avviene senza perdere i propri metodi e i propri attributi; il meccanismo descritto comporta non pochi vantaggi, infatti, sulla base dell'ereditarietà della OOP potremo definire una classe specificando semplicemente le differenze di quest'ultima con un'altra classe.

Quello dell'ereditarietà è un concetto abbastanza semplice da comprendere in quanto si basa sull'emulazione della realtà che ci circonda, infatti, nella vita quotidiana abbiamo numerosi esempi riguardanti il funzionamento di questo meccanismo.
Si pensi ad una classe chiamata animali, essa si trasfomerà in una classe base quando le classi derivate mammiferi e rettili erediteranno da essa le proprietà e i metodi mantenendo le proprie peculiarità; mammiferi e rettili saranno pur sempre degli animali in quanto dotati di caratteristiche similari che li rendono sottoclassi della medesima classe base, ciò non di meno preserveranno specificità in grado di renderli distinguibili tra loro. Procedendo nella scala gerachica, le due classi secondarie potranno suddividersi al loro interno in ulteriori derivate, ad esempio, in felini e bovini, in serpenti e lucertole, da cui tigri e bisonti, cobra e ..

Passiamo ora all'ultimo concetto base dell'OOP, il cosiddetto polimorfismo che è strettamente collegato alle dinamiche proprie dell'ereditarietà; con il polimorfismo è possibile originare comportamenti e risultati diversi impiegando i medesimi metodi a carico di oggetti differenti.
Il meccanismo polimorfico, è quindi fondato sulla possibilità di ridefinire in delle classi derivate comportamenti dati da uno o più metodi ereditati da una classe base. Potremmo così dare origine a metodi in grado di operare su oggetti di natura differente, sarà quindi compito dell'ambiente in cui funziona l'applicativo decidere quale metodo utilizzare "preferendolo" ad un altro sulla base delle azioni da svolgere sui differenti oggetti.

Il meccanismo del polimorfismo diventa palese nei processi di overloading, in questi ultimi infatti le classi derivate ridefiniscono metodi predefiniti nella classe base. Quando verrà utilizzato il metodo sottoposto a ridefinizione, quello prorio della superclasse verrà ignorato; con l'overloading, posto un insieme di classi in relazione gerarchica, per ciascuna di esse saremo in grado di impiegare diversamente un metodo presente in altre classi.

Attenzione: questo articolo è stato concesso in esclusiva per la pubblicazione a Mrwebmaster.it; ne è vietata la riproduzione, anche parziale, senza l'esplicito consenso dell'autore e della redazione di Mrwebmaster.it.

© Claudiogarau.it :: Tutorials & Scripts, PHP, Linux and more.

Stampa :: Torna alla Home