4
respostas

protected

Neste exercicio diz que o codigo compila. Mas como pode o codigo compilar se o atributo saldo é private para escritura. Para que esse codigo compilasse a propriedade set teria que ser protected nao?

class Conta 
{
    public double Saldo { get; private set; }
    public void Deposita (double valor)
    {
        this.Saldo += valor;
    }
}

class ContaPoupanca : Conta { }


ContaPoupanca cp = new ContaPoupanca();
cp.Deposita(200.0);
4 respostas

Oi Janile, tudo bem ?

O private nesse caso está falando que ninguém de fora da classe terá acesso para mexer diretamente com esse atributo.

Contudo nossa classe pode, internamente, manipular esse atributo, tanto que é o que fazemos no método Deposita()

Por isso nao entendo como o código compila se o atributo saldo tem o set private. Entao, porque a classe conta poupanca pode manipular esse atributo?

Lembre-se que a ContaPoupanca é uma Conta, então por conta da herança ela tem tudo que a classe pai tem, todos os métodos, atributos e construtores.

Por isso ela consegue ter acesso.

Oi Janile, fica mais fácil entender da seguinte forma: Um atributo privado pode ter seu valor alterado somente pela classe cujo a qual ele pertence. Como ContaPoupanca é filha de Conta, quando vc chama o método Deposita, você está chamando na verdade o método da classe Conta (que é mãe/base dela) e não da classe ContaPoupanca.

Agora, se vc quisesse que o comportamento do método Deposita fosse diferente para ContaPoupanca, você teria que sobrescrever ele na classe ContaPoupanca, e aí sim tornar saldo protected ( e o método Deposita virtual, para poder sobreescrever), pois você precisaria acessar de uma classe filha:

class Conta
{
    public double Saldo { get; protected set; }
    public virtual void Deposita(double valor)
    {
        this.Saldo += valor;
    }
}

class ContaPoupanca : Conta
{

    public override void Deposita(double valor)
    {
        if (valor >= 100) //Se por exemplo esta conta só aceitasse depositos maior ou igual a 100
        {
            this.Saldo += valor;
        }
    }
}