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 #?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top