Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Dichiarare una Classe in una Libreria
Forum - Pascal - Dichiarare una Classe in una Libreria

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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???

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 15:04
Giovedì, 24/06/2010
La dichiarazione del tipo del tipo :
Codice sorgente - presumibilmente Delphi

  1. type
  2. <nome> = object
  3. private
  4. ...
  5. public
  6. ...
  7. end;

va inserita nell'interface.

Le procedure le dichiaro nell'implementazione.

Ultima modifica effettuata da Phi il 24/06/2010 alle 15:04
PM Quote
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 16:28
Giovedì, 24/06/2010
Ecco il sorgente :
Codice sorgente - presumibilmente Delphi

  1. unit Prova;
  2.  
  3. interface
  4.  
  5. type
  6.   TProgrammatore = object
  7.    private  //tutti i dati privati
  8.      Linguaggio : String;
  9.      Sito       : String;
  10.    public   //le funzioni per la gestione dei dati
  11.      constructor Init;
  12.      function  PrendiLin : String;
  13.      function  PrendiSit : String;
  14.      procedure SettaLin(NewLin : String);
  15.      procedure SettaSit(NewSit : String);
  16.   end;
  17.  
  18.   TEred = object(TProgrammatore)
  19.    private
  20.      
  21.    public
  22.      constructor Init;
  23.   end;
  24.  
  25. implementation
  26.  
  27. constructor TProgrammatore.Init;
  28. begin
  29.  Linguaggio  := '';
  30.  Sito        := '';
  31. end;
  32.  
  33. function  TProgrammatore.PrendiLin : String;
  34. begin
  35.  PrendiLin  := Linguaggio;
  36. end;
  37.  
  38. function  TProgrammatore.PrendiSit : String;
  39. begin
  40.  PrendiSit  := Sito;
  41. end;
  42.  
  43. procedure TProgrammatore.SettaLin(NewLin : String);
  44. begin
  45.  Linguaggio := NewLin ;
  46. end;
  47.  
  48. procedure TProgrammatore.SettaSit(NewSit : String);
  49. begin
  50.  Sito := NewSit;
  51. end;
  52.  
  53. constructor TEred.Init;
  54. begin
  55.  inherited Init; //eredita tutto ciò di TProgrammatore
  56.  writeln('Questa è una classe ereditata');
  57. end;
  58.  
  59. 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
PM Quote
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 16:28
Giovedì, 24/06/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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:47
Giovedì, 24/06/2010
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..

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:02
Giovedì, 24/06/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à.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:10
Giovedì, 24/06/2010
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
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:22
Giovedì, 24/06/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.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:32
Giovedì, 24/06/2010
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
PM Quote