Autore Topic: [RISOLTO] Dichiarazione property  (Letto 2099 volte)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
[RISOLTO] Dichiarazione property
« il: 16 Marzo 2013, 11:54:40 »
Quando si crea una classe le propietà della classe si possono dichiarare semplicemente con
public proprietà as integer

oppure usando
function proprietà as integer

creando poi le funzioni read e write per accedervi

qul'è il metodo migliore tra i due?

« Ultima modifica: 21 Marzo 2013, 09:44:11 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #1 il: 16 Marzo 2013, 22:09:21 »
Le proprietà di qualsiasi oggetto sono sempre private, come privati sono i simboli a cui esse fanno riferimento. Qualunque altro oggetto debba accedere al valore di uno dei suddetti simboli deve farlo attraverso la proprietà cui è associato.
Per dichiarare una proprietà la strada è una sola: utilizzare la parola chiave Property

Property Nome As Tipo definisce una proprietà in lettura/scrittura
Property Read Nome as Tipo definisce una priprietà in sola lettura.

Tieni presente che l'IDE crea automaticamente le procedure di gestione delle proprietà alla pressione del tasto Invio

Alla proprietà viene poi associato un simbolo dello stesso tipo per contenerne il valore.

Supponi di avere una classe Automobili, per ciascuna automibile dovrai gestire diversi parametri:
- Colore
- Cilindrata
- Modello
...

avremo quindi la Classe automobile:

Codice: gambas [Seleziona]
' Gambas class file



' definisco le properità
Property Colore As Integer
Property Modello As String
Property Cilindrata As String

Property Read Allestimento as String

' definisco i simboli associati alle proprietà
Private $Colore As Integer
Private $Modello As String
Private $Cilindrata As String
private $Allestimento as String

Public Sub _new(versione As String)
  $Allestimento = versione
End


' le funzioniutilizzate per gestire le proprietà
Private Function Colore_Read() As Integer
  Return $Colore
End

Private Sub Colore_Write(Value As Integer)
  $Colore = Value
End

Private Function Modello_Read() As String
  Return $Modello
End

Private Sub Modello_Write(Value As String)
  $Modello = Value
End

Private Function Cilindrata_Read() As String
  Return $Cilindrata
End

Private Sub Cilindrata_Write(Value As String)
  $Cilindrata = Value
End

Private Function Allestimento_Read()
 Return $Allestimento
End


Nella classe ConfiguraVettura avremo:

Codice: gambas [Seleziona]

Public Sub Configura()
Dim Vettura As Automobile
  With Vettura = New Automobile("luxury")
     ' la proprietà Allestimento in sola lettura viene impostata tramite la sub _new(...)
    .Cilindrata = "1368" ' imposto la proprietà Cilindrata
    .Colore = Color.Red  ' imposto la proprietà Colore
    .Modello = "sotema"
  End With
End
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: dichiarazione property
« Risposta #2 il: 17 Marzo 2013, 01:53:43 »
Ciao sotema:ciao:
volevo segnalare che a questa riga:
Codice: gambas [Seleziona]

   Private Function Allestimento_Read()

viene sollevato un errore; hai dimenticato di scrivere:
Codice: gambas [Seleziona]

   Private Function Allestimento_Read() As String



Va be'... ad ogni modo, a me premeva domandare quale differenza sostanziale vi sarebbe fra una Classe specifica, nella quale sono definite le Proprietà, e questa altra Classe specifica più semplice e spartana:
Codice: gambas [Seleziona]

Public Colore As Integer 
Public Modello As String 
Public Cilindrata As String
Public Allestimento As String
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: dichiarazione property
« Risposta #3 il: 17 Marzo 2013, 09:24:03 »
Aggiungo
la classe si può anche inizializzare passando tutti i parametri alla funzione _new

Codice: gambas [Seleziona]
public sub  _new (prop1 as integer, prop2 as string , prop3 as boolean, prop4 as byte)

    $proprieta1 = prop1
    $proprieta2 = prop2
    $proprieta3 = prop3
    $proprieta4 = prop4

end


è corretto anche questo metodo?

Il metodo suggerito da Sotema però mi sembra forse quello più corretto, confermi?
"e il naufragar m'è dolce in questo mar"

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #4 il: 17 Marzo 2013, 09:59:36 »
Nella programmazione ad oggetti, ritengo sia una soluzione migliore mantenere le variabili Private ed usare le proprietà dell'oggetto, appunto, per impostarne i valori.  La qual cosa permette inoltre un maggior controllo, in quanto all'interno delle procedure di scrittura/lettura delle proprietà puoi inserire codice di verifica e gestione, cosa che non è possibile con una variabile pubblica.

Aggiungo
la classe si può anche inizializzare passando tutti i parametri alla funzione _new

Codice: gambas [Seleziona]
public sub  _new (prop1 as integer, prop2 as string , prop3 as boolean, prop4 as byte)

    $proprieta1 = prop1
    $proprieta2 = prop2
    $proprieta3 = prop3
    $proprieta4 = prop4

end



In questo caso utilizzi delle variabili che possono anche essere private, purchè globali. Ma ti consiglierei di utilizzare l'opzione Optional:
Codice: gambas [Seleziona]
Public Sub _new(Optional prop1 as integer...)

...

End

perchè non è sicuro che ogni qualvolta instanzi la classe tu abbia la possibilità di passargli che parametri.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: dichiarazione property
« Risposta #5 il: 17 Marzo 2013, 11:02:55 »
ok
ora ho le idde più chiare

approfitto per un'altra domanda
si possono dichiarare delle proprietà con dei sottogruppi?

esempio

all'interno della classe c'è un gruppo chiamato seriale
per cui

classe.seriale.velocità=9600

classe.seriale.parità=none

classe.nome="pippo"

"e il naufragar m'è dolce in questo mar"

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #6 il: 17 Marzo 2013, 11:48:53 »
Se ho capito bene hai una serie di oggett (gruppi) ciascuno con compiti specifici.
In qusto caso potresti usare il cobcetto di ereditá.
Hai la classe padre in cui inserisci i metodi e le proprietà comuni a tutti i gruppi poi scrivi una classe figlia per ciascun gruppo con le proprietâ ed i metodi spegifici.
La prima istruzione delle classi figlie deve essere
Inherits Padre
« Ultima modifica: 17 Marzo 2013, 12:50:55 da sotema »
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: dichiarazione property
« Risposta #7 il: 17 Marzo 2013, 12:02:46 »
tutto questo all'interno della classe padre?
cioè dall'esterno io vedo solo la classe padre mentre all'interno venono create sottoclassi
quindi mi riferirò alle proprietà delle classi figlie con

classepadre.classefiglia.proprietà

corretto?
"e il naufragar m'è dolce in questo mar"

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #8 il: 17 Marzo 2013, 12:49:59 »
Allego piccolo esempio...
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: dichiarazione property
« Risposta #9 il: 17 Marzo 2013, 13:09:50 »
non esattamente
volevo semplicemente semplificare la lista delle proprietà

immagina di avere una classe con 50 proprietà (esagerato)

alcune di queste fanno riferimento a caratteristiche di un oggetto interno
esempio

una calsse fa riferimento ad un sistema di comunicazione
all'interno di esso uso la porta seriale e diversi protocolli


avro un gruppo di proprietà che si riferisce alla porta di comunicazione, alòtri al protocollo, altre ancora ai dati

ecco quindi che per semplificare scriverò


Classe.seriale.baudrate = 9600
Classe.seriale.FlowControl = "none"
Classe.protocollo.crc=16

quindi il gruppo seriale descrive le proprietà della porta con le sue impostazioni e così lo stesso per il gruppo protocollo


 
"e il naufragar m'è dolce in questo mar"

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #10 il: 17 Marzo 2013, 13:28:03 »
La classe figlia eredita tutte le proprietà della classe genitrice,da cui non ti serve indirizzare la proprietà con

Classe.seriale.baudrate, sintassi per altro scorretta ed impedita dall'interprete gambas

semplicemente
.baudrate = 9600

imposterà la velocità di comunicazione della porta seriale selezionata.

Oppure non ho capito una cippa di quello che vuoi ottenere
 ???
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: dichiarazione property
« Risposta #11 il: 17 Marzo 2013, 13:55:09 »
volevo proprio ottenere quello che è impedito dall'interprete gambas
classe.seriale.velocità

cioè allinterno delle proprietà della classe suddividere in sottogruppi di proprietà e riferirmi a loro citando prima il sottogruppo alle quali appartengono e poi il nome della proprietà stessa
la cosa è un po cervellotica, ma volevo provare anche questa

mi sembra però di avere visto qualche classe che ha un meccanismo simile, solo che non ricordo dove
se mi tornerà in mente lo scriverò

comunque grazie per la pazienza nell' assecondare i miei incubi notturni........ 
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: dichiarazione property
« Risposta #12 il: 17 Marzo 2013, 14:50:15 »
....in quanto all'interno delle procedure di scrittura/lettura delle proprietà puoi inserire codice di verifica e gestione,

Puoi fare un semplice caso/esempio ?


Ad ogni modo, mi pare che il risultato fra le due tipologie di Classi specifche sia sostanzialmente uguale. No ?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: dichiarazione property
« Risposta #13 il: 17 Marzo 2013, 19:12:36 »
vedi i sorgenti allegati 4 post precedenti
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: dichiarazione property
« Risposta #14 il: 18 Marzo 2013, 12:28:05 »
All'interno di un oggetto si possono inserire proprietà di tipo oggetto, permettendoti quindi di gestire la cosa nel formato:

oggettoprimary.proprieta.proprietaoggettosecondario

E' altresì da ricorddarsi di creare le proprietà oggetto nella fase di creazione dell'oggetto contenitore (quindi nella _new()), oppure tener presente durante la gestione che la proprietà potrebbe essere nulla.

Le proprietà possono poi essere gestite con i metodi _Read e _Write, indicando appunto il tipo di parametro passato o ritornato dello stesso tipo della proprietà.

E' anche possibile, e forse sarebbe anche meglio in termini di dinamicità del codice, definire la proprietà come Object standard, e poi trattarla nel modo che ci interessa.