Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Eu mantive o método como protected, mas o phpstorm me pede pra colocar como public, por quê?

Olá! Nesta aula eu mantive o "percentualTarifa" como protected nas classes criadas. Ficando assim:

ContaPoupaca.php ficou:

<?php

namespace Alura\B\Modelo\Conta;

class ContaPoupanca extends Conta
{
    protected function percentualTarifa(): float
    {
        return 0.03;
    }
}

E ContaCorrente.php ficou:

<?php

namespace Alura\B\Modelo\Conta;

class ContaCorrente extends Conta
{
    protected function percentualTarifa(): float
    {
        return 0.05;
    }

    public function transfere(float $valorATransferir, Conta $contaDestino): void
    {
        if ($valorATransferir > $this->saldo) {
            echo "Saldo indisponível";
            return;
        }

        $this->saca($valorATransferir);
        $contaDestino->deposita($valorATransferir);
    }
}

Mas na hora de executar o arquivo teste-saque.php ele reclama pedindo pra ficar publica. "Fatal error: Access level to Alura\B\Modelo\Conta\ContaPoupanca::percentualTarifa() must be public (as in class Alura\B\Modelo\Conta\Conta)"

Qual seria alternativa pra que ela não fique pública? (Não seria um problema ela pública?)

4 respostas

Amanda, segundo o erro, o método percentualTarifa na classe Conta está público.

Não é possível restringir a visibilidade de um método herdado na orientação a objetos, entende?

Ah sim, então ao herdar não tem como manter um método do "pai/mãe" restrito das classes "filhos", é isso?

solução!

Não, Amanda. Não tem como restringir um método público das classes base.

Se um método da classe base é público, ele precisa ser público nas classes derivadas (filhas). Não pode ser privado ou protegido.

Se um método da classe base é protegido (protected), ele precisa ser protegido ou público nas classes base. Não pode ser privado.

:-)

Você pode abrir mais a visibilidade, mas não restringir, entende? Senão algum código que espera uma instância de Conta, por exemplo, pode depender do método percentualTarifa, visto que ele é público, mas em alguma classe derivada você restringiu a visibilidade, o que impediria o polimorfismo.

Ahhh! Agora consegui entender sim!!! Eu não tinha ainda percebido, mesmo você explicando eu não tinha compreendido, que o que eu estava fazendo era colocar o método na classe base como público, e ao derivar eu queria manter o protected, restringir nas classes derivadas, e aí que era o erro. Eu entendi agora depois de reler e mexer varias vezes lá, e coloquei como protected na classe base, assim:

abstract protected function percentualTarifa(): float;

Agora sim ele funciona podendo ser protected ou público nas classes derivadas (filhas). É que estava difícil de eu entender o que estava acontecendo, mesmo lendo, as vezes demora a entrar na cabeça alguns conceitos, perdão.

Obrigada mais uma vez, professor!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software