()
Newbie
Messaggi:
Iscritto:
|
Come fare? Se dovessi dichiarare un tipo derivato lo dichiarerei direttamente nell'interface. Però in questo caso mi serve implementare i metodie i costruttori/distruttori che dichiaro nella classe. Dove le metto le dichiarazioni di tali elementi? E dove dichiaro la classe???
|
|
Phi (Member)
Expert
Messaggi: 241
Iscritto: 30/12/2009
|
La dichiarazione del tipo del tipo :
Codice sorgente - presumibilmente Delphi |
type <nome> = object private ... public ... end;
|
va inserita nell'interface.
Le procedure le dichiaro nell'implementazione.
Ultima modifica effettuata da Phi il 24/06/2010 alle 15:04 |
|
Saladino (Member)
Pro
Messaggi: 90
Iscritto: 30/05/2010
|
Ecco il sorgente :
Codice sorgente - presumibilmente Delphi |
unit Prova; interface type TProgrammatore = object private //tutti i dati privati Linguaggio : String; Sito : String; public //le funzioni per la gestione dei dati constructor Init; function PrendiLin : String; function PrendiSit : String; procedure SettaLin(NewLin : String); procedure SettaSit(NewSit : String); end; TEred = object(TProgrammatore) private public constructor Init; end; implementation constructor TProgrammatore.Init; begin Linguaggio := ''; Sito := ''; end; function TProgrammatore.PrendiLin : String; begin PrendiLin := Linguaggio; end; function TProgrammatore.PrendiSit : String; begin PrendiSit := Sito; end; procedure TProgrammatore.SettaLin(NewLin : String); begin Linguaggio := NewLin ; end; procedure TProgrammatore.SettaSit(NewSit : String); begin Sito := NewSit; end; constructor TEred.Init; begin inherited Init; //eredita tutto ciò di TProgrammatore writeln('Questa è una classe ereditata'); end; end.
|
Nota la notazione a punto simile a quella dei record.
Ricorda di non mettere mai dati nella sezione public.
Questo garantisce infatti il mantenimento dell'incapsulamento.
Ultima modifica effettuata da Saladino il 24/06/2010 alle 16:29 |
|
Saladino (Member)
Pro
Messaggi: 90
Iscritto: 30/05/2010
|
La cosa migliore che ti consiglio è di andare al sito FreePascal e vedere la documentazione.
E' molto dettagliata.
Ultima modifica effettuata da Saladino il 24/06/2010 alle 16:33 |
|
()
Newbie
Messaggi:
Iscritto:
|
Grazie mille per la risposta. Non capisco però perchè non dovrei mettere dati nella public. Anzi per meglio dire, non ho capito proprio perchè c'è la divisione tra public e private..io considero la classe come un tipo derivato arricchito di procedure, funzioni, costruttori e distruttori..
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Lo scopo delle classi, in programmazione, è quello di elaborare i dati in maniera sicura, e "semplice".
Di conseguenza, è importante non trattare direttamente le variabili.
In pascal, ho notato che i qualificatori public, protect e private, funzionano solo se le classi vengono implementate nelle unità.
|
|
()
Newbie
Messaggi:
Iscritto:
|
Quindi dovrei modificare i dati tramite le procedure contenute nella classe? Ma allora che differenza c'è tra mettere un determinato dato nel membro public o private?
Cerco di spiegarmi meglio...i dati contenuti nella private sono modificabili solo dalle procedure/metodi/constructors/distructors contenuti nella classe e non da elementi esterni alla classe, no?..ma se io devo modificare tali dati con una procedura/metodo/constructor/distructor contenuta nella classe che senso ha fare distinzione tra i due membri (quando si va a dichiarare un determinato dato)? se un dato va o non va modificato con elementi esterni alla classe in fondo io (programmatore) lo so e userò solo procedure appartenenti alla classe per modificarlo, quindi qual'è il senso di tutto ciò???
Ultima modifica effettuata da il 24/06/2010 alle 21:11 |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Fa differenza eccome!!
All' inizio, è difficile rendersene conto, ma immagina di progettare una classe che risolva un determinato problema.
Quindi , a questo punto, altri possono utilizzare senza problemi il tuo lavoro perchè i dati sono trattati esclusivamente dalle funzioni interne della classe. Non è neanche necessario confrontarsi nuovamente con la complessità del problema, basta solo sapere lo scopo delle funzioni, e quali dati ricevono.
Inoltre, col meccanismo dell' ereditarietà, è molto semplice ampliare o modificare la classe.
|
|
()
Newbie
Messaggi:
Iscritto:
|
Purtroppo non riesco a capire non riesco ancora a capire la oop...purtroppo non ho trovato ancora il metodo per entrare in quest'ottica che al momento mi risulta "strana". Qualche consiglio?
Poi, avrei un altro problemino..sto realizzando pacman e sono già a buon punto..per snellire il sorgente del main rendendolo essenziale volevo dividerlo in 1 main e 2 librerie di supporto. 1 contenente la classe entita (classe di cui i fantasmi e pacman stesso sono istanze) e l'altra contenente tutte le funzioni grafiche. Il problema è che spesso si fa riferimento a 2 array (quello dei puntatori in cui sono contenute le immagini di pacman e i fantasmi..e quello del campo, un semplice array booleano bidimensionale) contenuti nel main e ciò rende impossibile la scissione da questo.
EDIT: a meno che non importo pure questi 2 array all'interno della classe entità...ma così fare ben 5 copie dello stesso array in termini di memoria non è pesantuccio??
Ultima modifica effettuata da il 24/06/2010 alle 21:40 |
|