... cercate di spiegarvi un po più terra terra per favore...
Giacché questa intera discussione verrà in futuro letta anche da neofiti della programmazione Orientata agli Oggetti, ne approfitto per spiegare la questione.
Nel suddetto tipo di Programmazione il pilastro fondamentale è il concetto di "Classe".
La "Classe" è un Modello astratto che racchiude e riassume tutte le caratteristiche funzionali (risorse) di un sistema di risorse per compiere ed ottenere un risultato.
La "Classe" è il sistema principale che possiede le risorse per svolgere la sua specifica funzione, per la quale è stata prevista.
« La "Classe" è un sistema organico di risorse tra loro coerenti per la realizzazione di una o più finalità. »
E' nella "Classe" che noi troviamo, come in un insieme, in una Categoria, specifiche capacità e specifiche competenze per poter perseguire e realizzare un risultato.
Le risorse di una "Classe" sono rappresentate da "Proprietà" (una risorsa che definisce una caratteristica assumibile), da "Metodi" (una capacità di fare qualcosa) e da "Eventi" (far accadere qualcosa).
La mera dichiarazione di una determinata "Classe" nel nostro codice non è sufficiente per richiamare e utilizzare nel codice tali risorse, poiché la "Classe" - se non è Statica - è "in potenza" le sue risorse possedute, ossia ha una capacità solo "potenziale" di esprimerle e di fornirle. Essa le possiede "virtualmente" La "virtù" di una cosa è la sua mera "attitudine" a essere o compiere qualcosa. E' insomma una capacità astratta. La "Classe" ci dice: "Io ho la capacità di fornire queste risorse, ma essendo una realtà astratta, le posseggo solo potenzialmente, non sono capace di fornirle in pratica.".
Affinché, dunque, il programmatore possa richiamare e utilizzare le tre risorse (o almeno quelle possedute) di una "Classe", questa deve essere "istanziata", deve essere "creata", posta nella realtà del codice che il programmatore sta scrivendo.
La "creazione" - senza voler tirare in ballo concetti filosofici o, peggio, teologici - consiste, appunto, nella concretizzazione di un'idea. L'idea, ossia la realtà con le sue risorse, si fa concreta, si "individualizza", diventa una "cosa", "causa" della creazione. La "Classe" diventa un "Oggetto".
La non staticità di una "Classe" consente al programmatore di creare più Oggetti di essa (questa facoltà non è consentita ad esempio per le Classi statiche e per i Moduli che sono "statici" per propria natura).
Come soltanto una realtà concreta può agire nel mondo, così nella programmazione soltanto un elemento concreto - l'Oggetto - può fornire e far agire le sue risorse, può dunque funzionare.
La creazione, la "istanziazione" della "Classe", affinché essa - come già detto - possa felicemente fornire le sue tre risorse, avviene solitamente nella codificazione in Gambas con la parola-chiave "NEW".
Questa riga astratta, significa che la variabile identificatrice rappresenta un Oggetto
creato che appartiene ad una specifica Classe.
Ma la creazione di Oggetto di una "Classe" ha bisogno di sostanza anch'essa concreta, affinché possa effettivamente attuarsi. Questa sostanza è la memoria.
Gli "Oggetti" in Gambas sono costituiti da Strutture e Sub-Strutture, scritte in C, che ovviamente occupano memoria. Gambas con la parola-chiave "NEW" riserverà una certa quatità di memoria dedicata e destinata a far esistere e a far funzionare l'Oggetto, ossia a fornire e gestire le risorse che esso possiede in quanto "istanza" di una determinata "Classe".
Gambas, ovviamente, fornisce un elemento fondamentale, un escamotage, affinché il programmatore possa gestire nel codice agevolmente quell'Oggetto istanziato: un identificatore rappresentante, ossia la
variabile identificatrice dell'Oggetto:
variabile_identificatrice_dell'Oggetto = NEW CLASSE
Questa variabile è un "handle", una maniglia, uno strumento che ci consente di aprire la porta per accedere alla "stanza dei bottoni" della Classe, ossia alle risorse della Classe. Ma questa "stanza dei bottoni" non è in definitiva altro che l'Oggetto medesimo, ossia - detto più correttamente - quella quantità di memoria che il sistema riserva affinché l'Oggetto esista e possa essere utilizzato dal programmatore Gambas nel codice.
...quando ad esempio assegniamo un valore ad una Proprietà posseduta da una Classe (più concretamente: da un Oggetto istanziato di una Classe), dove credete che sia memorizzato quel valore ? ...all'interno di un membro di una sotto-Struttura che è parte della più ampia e complessiva memoria riservata per l'Oggetto, quando questo fu creato con la parola-chiave NEW.
Tutto è Memoria.
Questo
handle, questa variabile che rappresenta l'Oggetto di una Classe, dunque individua, indica e in certo senso fornisce al programmatore la prima cella di memoria della Struttura principale che costituisce l'Oggetto medesimo.
La variabile di un Oggetto "punta" all'area di memoria riservata all'Oggetto medesimo.
Questa prima cella di memoria, ove inizia la memoria rigidamente riservata dal sistema per l'esistenza e la funzionalità dell'Oggetto di una Classe, possiede un Indirizzo.
La variabile di un Oggetto punta dunque a quell'Indirizzo di memoria, si riferisce esplicitamente a quella cella di memoria; anzi esso contiene come valore proprio l'indirizzo di memoria di quella cella.
Public Sub Main()
Dim bb As New Byte[]
Print bb, Object.Address(bb)
End
Possedendo l'indirizzo di quella prima cella dell'area di memoria dell'Oggetto, lo si ha un pugno: può essere gestito dal programmatore. Soltanto così il programmatore può usare le risorse fornite dalla "Classe" per mezzo del suo "Oggetto" creato.
La variabile di un Oggetto facilita il programmatore in questo compito: usandola, egli penetra inconsapevolmente nell'anima dell'Oggetto di una Classe, nella sua area di memoria.
https://www.gambas-it.org/wiki/index.php?title=Gli_Oggetti_e_le_ClassiQuindi, passando la variabile dell'Oggetto, noi passiamo l'indirizzo di memoria dell'Oggetto.
https://www.gambas-it.org/wiki/index.php?title=Passaggio_di_un_argomento_per_%27indirizzo%27_ad_una_Funzione https://www.gambas-it.org/wiki/index.php?title=Scrivere_una_Funzione#Passaggio_per_indirizzoFaccio un semplicissimo esempio di passaggio per indirizzo:
Public Sub Main()
Dim bb As New Byte[] ' Crea un Oggetto della Classe array di tipo Byte[ ]
Sottoprocedura(bb) ' Passa la variabile identificatrice dell'Oggetto array appena sopra creato
Print bb[0]
End
Private Function Sottoprocedura(bt as byte[]) ' Riceve l'Oggetto array
bt.Push(44)
End
Non c'è bisogno di alcun "Return" nella sub-routine "Sottoprocedura", poiché "bb" e "bt" puntano al medesimo Indirizzo di memoria, alla medesima cella di memoria, ove inizia la Struttura principale che costituisce l'Oggetto di tipo array.