Rhino.Input.Custom.GetNumber getter = new Rhino.Input.Custom.GetNumber();
getter.SetCommandPrompt("Inserisci un numero");
getter.Get();
double a = getter.Number();
Per farne una metafora:
1
Rhino.Input.Custom.GetNumber getter = new Rhino.Input.Custom.GetNumber();
Questa riga crea un nuovo oggetto, chiamiamolo “postino”, “corriere” o “messaggero”.
È un corriere nuovo, non specializzato, senza istruzioni specifiche.
Conosce solo la sua destinazione: la barra di comando, l’utente.
2
getter.SetCommandPrompt("Inserisci un numero");
Qui diciamo al corriere cosa dire quando arriverà a destinazione.
3
getter.Get();
Ora diciamo al corriere “vai, parti” e lui parte a fare il suo lavoro (altrimenti stava li tranquillo a oziare).
In questo caso il corriere è andato a raccogliere una pizza (un numero double), e poi torna.
(Potremmo dire al corriere nuovamente “vai!” e lui partirebbe, buttando la vecchia pizza!)
4
double a = getter.Number();
Chiediamo al corriere di darci la pizza che ha ritirato.
Nota che “getter”, il nostro corriere, non è una pizza!
Potremmo avere molti altri tipi di “getter”: postini, messaggeri, sicari, ecc ecc …e dargli istruzioni diverse… o istruire in modo diverso il nostro corriere così che impari a ritirare panini (int).
Una cosa completamente diversa è questa, invece:
double x = 0;
Rhino.Commands.Result risultato = Rhino.Input.RhinoGet.GetNumber("Inserisci un numero", true, ref x);
In questo caso abbiamo un oggetto che viene “consumato” al volo, nell’istante in cui lo crei ha già compiuto il suo lavoro, ovvero impostare il numero ottenuto dentro la variabile “x”.
Molto più sbrigativo e senza fronzoli.
L’oggetto risultato non ha alcuna utilità, se non dirti se il comando è andato a buon fine (success/failure).
Si può omettere, così:
double x = 0;
Rhino.Input.RhinoGet.GetNumber("Inserisci un numero", true, ref x);
Si, decisamente.
I primi, i metodi di Rhinocommon come Input.Custom… o Input.RhinoGet sono metodi creati da McNeel per far interagire l’utente durante l’esecuzione di un codice.
I secondi, sono metodi “accessors” che permettono di gestire l’accessibilità di una proprietà di un oggetto.
Ad esempio, se io ho una classe così:
class Persona{
public string Nome;
public string Età;
}
Il nome ed età della persona sono pubblici, qualsiasi metodo esterno può modificarli senza che nient’altro accada.
Invece, se fai così:
class Persona{
private string Nome;
private int Età;
public string nome{
get{
return this.Nome;
}
set{
this.Nome = value;
}
}
public int eta{
get{
return this.Età;
}
set{
this.Età= value;
}
}
}
vedi che non si accede più direttamente alle proprietà dell’oggetto, ma attraverso un metodo, che ci permette dei get/set in base a come abbiamo deciso che sia permessa la lettura/scrittura di tale proprietà.
Nota che, essendo metodi potrebbero fare dell’altro, come:
class Persona{
private string Nome;
private int Età;
public string nome{
get{
return this.Nome;
}
set{
bool x = ChiedoAllAnagrafeSePossoCambiareNome();
if(x){this.Nome = value;}
}
}
public int eta{
get{
RispostaEmotivaInBaseAlContesto();
return this.Età;
}
}
}
Nel tuo esercizio sembra che vogliano dare un permesso solo di lettura a due variabili pubbliche, ma non ho mai usato struct quindi non so…