Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET]Dubbio sulle property di tipo reference sulla guida di Totem
Forum - C# / VB.NET - [VB.NET]Dubbio sulle property di tipo reference sulla guida di Totem

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Salve a tutti,
da qualche settimana stò studiando il vb.net, utilizzando la guida scritta da Totem.

Arrivato a pagina 82  dove spiega con un esempio le property di tipo reference .
Da quanto ho capito il sorgente che utilizza serve per creare un oggetto "temporaneo" in una variabile di un altra classe, senza modificarne il valore(ditemi se sbaglio).

il codice completo del sorgente con cui lui fà l'esempio è

Codice sorgente - presumibilmente VB.NET

  1. Class Cube
  2. Private _SideLength As Single
  3. Private _Density As Single
  4. Public Property SideLength() As Single
  5. Get
  6. Return _SideLength
  7. End Get
  8. Set(ByVal value As Single)
  9. If value > 0 Then
  10. _SideLength = value
  11. Else
  12. _SideLength = 1
  13. End If
  14. End Set
  15. End Property
  16. Public Property Density() As Single
  17. Get
  18. Return _Density
  19. End Get
  20. Set(ByVal value As Single)
  21. If value > 0 Then
  22. _Density = value
  23. Else
  24. _Density = 1
  25. End If
  26. End Set
  27. End Property
  28. Public ReadOnly Property SurfaceArea() As Single
  29. Get
  30. Return (SideLength ^ 2)
  31. End Get
  32. End Property
  33. Public ReadOnly Property Volume() As Single
  34. Get
  35. Return (SideLength ^ 3)
  36. End Get
  37. End Property
  38. Public ReadOnly Property Mass() As Single
  39. Get
  40. Return (Volume * Density)
  41. End Get
  42. End Property
  43. End Class
  44.  
  45. Class ASystem
  46. Private _Box As Cube
  47. Public ReadOnly Property Box() As Cube
  48. Get
  49. Return _Box
  50. End Get
  51. End Property
  52. '...
  53. End Class
  54. '...
  55. Sub Main()
  56. Dim S As New ASystem()
  57. S.Box.SideLength = 4
  58. End Sub



Il problema è che sull'istruzione:
Codice sorgente - presumibilmente Plain Text

  1. S.Boc.SideLenght = 4 'Errore:Riferimento a un oggetto non impostato su un'istanza di oggetto.



Allora ho provato a fare un po' di testa mia ed ho aggiunto un costruttore nella dichiarazione del campo che puntava alla classe cube

Codice sorgente - presumibilmente C# / VB.NET

  1. Private _Box As New Cube



facendo così il programma si esegue senza problemi.

Il dubbio è ho sbagliato io a interpretare quello che voleva spiegare, oppure era l'esempio che era sbagliato?

P.S Se notate qualche termine tecnico errato, fatemelo notare che sto imparando, e voglio imparare dai miei errori ;)

Grazie



PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 0:27
Sabato, 08/09/2012
Questo codice
Codice sorgente - presumibilmente VB.NET

  1. Class ASystem
  2. Private _Box As Cube
  3. Public ReadOnly Property Box() As Cube
  4. Get
  5. Return _Box
  6. End Get
  7. End Property
  8. '...
  9. End Class
  10. '...
  11. Sub Main()
  12. Dim S As New ASystem()
  13. S.Box.SideLength = 4
  14. End Sub


E' chiaramente incompleto (se fai caso ci sono dei "..." come a dire "altro codice",) e serviva per spiegare il concetto di reference per le proprietà degli oggetti.
L'errore che ti da il compilare è che l'oggetto _box di tipo cubo a cui fai riferimento con S.Box non esiste, non è stato istanziato. Per cui è corretto come fai tu
Codice sorgente - presumibilmente C# / VB.NET

  1. Private _Box As New Cube


Così lo crei, esiste ed è possibile riferirsi a esso, e alle sue proprietà.

Quando dici "serve per creare un oggetto "temporaneo" in una variabile", non è corretto. Rileggiti il passaggio dove piega i riferimenti alle variabili byVal (riferimento al valore) e byRef (riferimento reference, cioè all'area di memoria dove l'oggetto è creato).
Buono studio. 8-|

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 0:44
Sabato, 08/09/2012
Sisi avevo capito che mancava del codice xD

Ok grazie mille....era più che altro un capire se avevo capito(scusate il gioco di parole), domandavo perchè volevo sapere se avessi assimilato bene il concetto e a quanto pare non al 100%, e quindi mi sono dovuto fermare e non proseguire nello studio...infatti ogni esempio che propone, finche non ho capito, cosa fa, come, etc...non vado avanti.

Testo quotato

Postato originariamente da Renny:

Quando dici "serve per creare un oggetto "temporaneo" in una variabile", non è corretto. Rileggiti il passaggio dove piega i riferimenti alle variabili byVal (riferimento al valore) e byRef (riferimento reference, cioè all'area di memoria dove l'oggetto è creato).
Buono studio. 8-|


Grazie per l'indicazione rileggerò volentieri :D

P.S Grazie alla tua risposta dormirò sonni tranquilli :rofl::hail:

Ultima modifica effettuata da il 08/09/2012 alle 0:51
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 10:13
Sabato, 08/09/2012
Eh, figurati... Ci siamo passati tutti. Ma con lo studio le cose basilari diventano via via più facili e chiare. Rimangono solo i dubbi e la confusione mentale quando le cose diventano complesse e difficili. Ma ci si arriva per gradi.
Buono studio! :)

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:07
Sabato, 08/09/2012
spero di non andare OT.... in pratica ricapitolando

in poche parole questo metodo di programmazione consente di creare nuovi oggetti,  facendo ereditare i membri di un altra classe?

E' giusto o non ho ancora capito una mazza :'(

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 15:12
Sabato, 08/09/2012
Se ti riferisci alla differenza tra byRef e byVal no.
Per creare nuovi oggetti si una giustamente New.
Per fare ereditare ad un oggetto i membri (e le proprietà) da un'altra classe c'è un istruzione apposta ma bisogna capire e valutare il perché si fa...
Continua con lo studio e fai delle prove.. Così ti verrà più chiaro.
Ciao.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:35
Sabato, 08/09/2012
nono byval/ref ho capito la differenza cioè, la prima restituisce al metodo/funzione solamente il valore del parametro che gli passo,senza permettergli però di modificarne il valore al di fuori del metodo/funzione, mentre la seconda gli passa l'indirizzo nella memoria del parametro passatogli permettendogli di modificare di conseguenza il valore del parametro al di fuori della funzione.

Allora a quanto mi dici non ho capito una mazza di cosa serve :d:d:d:d

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 15:45
Sabato, 08/09/2012
Difatti non hai capito bene nemmeno byRef e ByVal, visto che ciò impedisce di modificare il valore, della proprietà di una proprietà di un oggetto, è la parola chiave ReadOnly, cioè sola lettura. Se la specifichi così, quella proprietà può solo essere letta e non impostata a nuovo valore.
Rileggiti qui.
http://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_ ...
E per il momento lascia stare l'eredità e il polimorfismo.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:28
Sabato, 08/09/2012
Adesso ho capito.... byval passa i tipi value mentre byref passa i tipi reference (ad esempio un oggetto)



In questo caso ogni qualvolta utilizzo la proprietà box(), questa essendo readonly, mi impedisce di assegnare un nuovo oggetto a  _box che sarebbe un puntatore di cubo, ma mi consente di modificare il valore dei campi della classe a cui lui punta.

Giusto?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo