1
resposta

Dúvida entre atributos private e protected com herança

Boa noite. No atributo $saldo para classe ContaBancaria, utilizei o modificador de acesso protected pois entendi que como a ClasseConta corrente ainda é uma ContaBancaria elas poderia comparatilhar da mesma variável sem a necessidade de isolar um saldo para conta bancária e outro para ContaCorrente utilizado o private. Meu raciocínio está correto? Perguntando aqui pois na seção de Opinião do instrutor ele declara saldo como private.

vejam só:

class ContaBancaria
{
    private int $saldo;

    public function sacar(int $valorASacar): void
    {
        if ($valorASacar > 0 && $this->saldo >= $valorASacar) {
            $this->saldo -= $valorASacar;
        }
    }

    public function depositar(int $valorADepositar): void
    {
        if ($valorADepositar > 0) {
            $this->saldo += $valorADepositar;
        }
    }
    public function consultarSaldo(): float
        {
            return $this->saldo;
        }
}

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Olá Murilo.
Tudo bem?
Vamos tentar entender...
O seu raciocínio está correto até certo ponto, mas o uso do protected e private vai depender de como você deseja controlar o acesso aos dados dentro da estrutura das classes e da herança.
Quando um atributo ou método é declarado como private, ele só pode ser acessado dentro da própria classe onde foi declarado.
Nenhuma outra classe, nem mesmo subclasses, pode acessar ou modificar esse atributo diretamente.
É o nível de encapsulamento mais restrito.
O modificador protected permite que o atributo ou método seja acessado não só pela própria classe, mas também pelas classes que a estendem (subclasses).
Ou seja, ele é "protegido", podendo ser usado por outras classes dentro da mesma hierarquia de herança.
O instrutor utilizou private para o atributo $saldo, provavelmente porque quer garantir que o saldo não seja alterado diretamente fora da classe ContaBancaria e suas subclasses.
A ideia por trás disso é proteger a integridade do saldo, tornando-o acessível apenas por meio de métodos públicos como sacar, depositar e consultarSaldo.
Se você usar protected, a variável $saldo poderia ser alterada diretamente nas subclasses (por exemplo, na classe ContaCorrente), o que poderia expor o saldo a modificações indesejadas ou inconsistentes.
Isso quebra um pouco o princípio de encapsulamento, um dos pilares da programação orientada a objetos, que visa proteger o estado interno dos objetos.
Se você tiver uma classe ContaCorrente que herda de ContaBancaria, e a variável $saldo for protected, a classe ContaCorrente poderia alterar diretamente o saldo, o que pode ser útil ou não dependendo da lógica do seu sistema.
Por exemplo:

class ContaCorrente extends ContaBancaria
{
    public function cobrarTarifaMensal()
    {
        $this->saldo -= 10;  // Isso seria permitido, já que saldo é protected
    }
}

Porém, se o saldo fosse private, você precisaria criar métodos específicos (como consultarSaldo ou algum outro método de acesso) para interagir com o saldo na classe ContaCorrente.
Se você quer controlar totalmente o acesso e garantir a integridade do saldo, deve manter o atributo como private.
Isso força a interação com o saldo apenas através de métodos públicos e bem definidos.
Se você deseja permitir que subclasses alterem o saldo diretamente, pode usar protected.
No entanto, isso pode acabar expondo o saldo a mudanças não controladas, o que pode ser problemático em sistemas mais complexos.
O private é recomendado para seguir boas práticas de encapsulamento e garantir que o saldo não seja alterado de maneira não controlada, inclusive nas subclasses.
Espero ter respondido sua pergunta.
Comente ai qualquer duvida.
Bons estudos.