Getter e Setter sono un mezzo per esporre le proprietà delle classi. Sono funzioni a senso unico. Possono ottenere (restituire un valore) o impostare (accettare un valore), ma non eseguono entrambi la stessa funzione. Anche le proprietà C # che eliminano le funzioni get get e set mantengono l'operazione a senso unico.
Quindi se ho
Quindi c'è un'operazione implicita su una proprietà chiamata Foo
. A causa della magia dell'incapsulamento, non mi interessa care se l'oggetto interno è chiamato Foo
. So solo che se ho SetFoo()
e poi GetFoo()
allora ci dovrebbe essere un certo grado di collegamento logico tra le mie operazioni.
Quindi non hai getter | setter nel tuo esempio. Sì, so che sono chiamati così, ma non è quello che stanno facendo. Il terzo frammento mostra davvero la deviazione dal concetto di proprietà. public Bar setFoo(String foo)
significa che ho impostato un Foo
ma ottengo un Bar
indietro? Cosa?!
È necessario selezionare un verbo diverso da "Imposta" da utilizzare in questo caso, poiché la funzione non sta eseguendo un'operazione impostata. Qualcosa come public Bar AnalyzeFoo(String foo)
può essere una descrizione più appropriata di ciò che sta facendo la funzione e nasconde ancora il fatto che c'è un'operazione molto costosa su Bar
come parte della funzione.
Un esempio più concreto può aiutare.
Questo prossimo esempio è negativo, per i motivi spiegati sopra:
public ProfitMargin SetInvoice(Invoice inv)
Ma questo esempio ha più senso:
public ProfitMargin AnalyzeInvoice(Invoice inv)
Non so o non ho bisogno di sapere quanto è costosa un'operazione per separare il Invoice
e identificare il margine di profitto; la funzione AnalyzeInvoice()
si occupa di questo per me.
Una breve nota su cosa intendevo per le proprietà C # ...
Sì, devo ancora definire il get & imposta le routine ma sono espresse come parte della proprietà e non richiedono funzioni aggiuntive come Java usato per richiedere.
Quindi in C #, ho:
private ____ xyz
public ____ MyProp {
get { .... return xyz; }
set { .... xyz = value; }
}
Mentre la vecchia scuola Java richiedeva funzioni esplicite:
private ____ xyz;
public ____ GetMyPrep() { ... return xyz; }
public void SetMyPrep(____ value) { ... xyz = value; }
Entrambi funzionano bene e gli IDE moderni semplificano il getter | creazione setter. Il punto è che entrambi gli approcci sono ancora operazioni a senso unico.