Esempi di sviluppo guidato dai test Con l'esempio di Kent Beck
Domanda
Sto leggendo Test Driven Development: By Example e uno degli esempi mi sta infastidendo. Nel capitolo 3 (Uguaglianza per tutti), l'autore crea una funzione uguale a
nella classe Dollar
per confrontare due oggetti Dollar
:
public boolean equals(Object object)
{
Dollar dollar= (Dollar) object;
return amount == dollar.amount;
}
Quindi, nel seguente capitolo (4: Privacy), rende un membro privato della classe del dollaro.
private int amount;
e i test superano. Ciò non dovrebbe causare un errore del compilatore nel metodo uguale a
perché mentre l'oggetto può accedere al proprio membro importo
in quanto non ha accesso all'altro Dollar membro
importo
dell'oggetto?
//shouldn't dollar.amount be no longer accessable?
return amount == dollar.amount
Sto fondamentalmente fraintendendo private
?
Aggiorna Ho deciso di tornare indietro e scrivere il codice insieme al libro manualmente e quando sono arrivato alla parte successiva (capitolo 6 - Equality For All, Redux) dove spingono la quantità in una classe genitore e la rendono protetta, ottengo problemi di accesso:
public class Money
{
protected int amount;
}
public class Dollar : Money
{
public Dollar(int amount)
{
this.amount = amount;
}
// override object.Equals
public override bool Equals(object obj)
{
Money dollar = (Money)obj;
//"error CS1540: Cannot access protected member 'Money.amount'
// via a qualifier of type 'Money'; the qualifier must be of
// type 'Dollar' (or derived from it)" on the next line:
return amount == dollar.amount;
}
}
Significa che protetto
È basato sull'istanza in C #?
Soluzione
Sì, sei fondamentalmente frainteso come privato. La privacy è specifica della classe, non specifica dell'istanza.
Altri suggerimenti
Fondamentalmente incomprensioni private, Dollar può accedere a qualsiasi metodo privato Dollar se appartiene alla stessa classe.
Il modificatore privato è classe-privato , non oggetto-privato.
In Java, private
significa class-private. All'interno della classe, puoi accedere a quel campo in tutte le istanze della classe.
In Scala esiste anche un ambito oggetto-privato che è scritto private [this]
. Anche per altri aspetti gli ambiti di Scala sono più flessibili (vedi questo articolo per ulteriori informazioni).
Ma in Java non esiste un ambito oggetto-privato.
Nei linguaggi della famiglia C ++ (C ++, Java, C #), il controllo degli accessi è solo a livello di classe. Quindi private
consente l'accesso a qualsiasi istanza di quella classe.
IIRC nella privacy di Smalltalk si comporta come previsto.