1
resposta

Corrigi o código do padrão State mas tem uma linha que ainda está dando erro. Ela está protected. Está certo isso ??


 public class Conta
    {

        interface IEstadoDaConta
        {
            void Saca(Conta conta, double valor);
            void Deposita(Conta conta, double valor);

        }

        public double Saldo { get; set; }
        public double Valor { get; set; }
        public DateTime DataAbertura { get; set; }

        protected IEstadoDaConta  EstadoAtualDaConta;  // ESSA LINHA ESTÁ DANDO ERRO  

     IEstadoDaConta  EstadoAtualDaConta;  <<=== ESTÁ CORRETO DEIXAR ASSIM ????    

    // AQUI EU COMENTEI PARA NÃO SER USADO. TUDO CERTO ???
        //public void Deposita(double valor) 
        //{
        //    Saldo += valor;
        //}


        class Positivo : IEstadoDaConta
        {
            public void Deposita(Conta conta, double valor)
            {
                conta.Saldo += valor * 0.98;
            }

            public void Saca(Conta conta, double valor)
            {
                conta.Saldo -= valor;

                if (conta.Saldo < 0)
                {
                    conta.EstadoAtualDaConta = new Negativo();
                }
            }
        }


        class Negativo : IEstadoDaConta
        {
            public void Deposita(Conta conta, double valor)
            {
                conta.Saldo += valor * 0.95;

                if (conta.Saldo > 0)
                {
                    conta.EstadoAtualDaConta = new Positivo();
                }
            }

            public void Saca(Conta conta, double valor)
            {
                throw new Exception("Sua conta esta no vermelho. Nao e possivel sacar.");
            }
        }



        public void Saca(double valor)
        {
            EstadoAtualDaConta.Saca(this, valor);
        }

        public void Deposita(double valor)
        {
            EstadoAtualDaConta.Deposita(this, valor);
        }


    }
1 resposta

Olá, Maurício!

Veja o erro gerado:

Inconsistent accessibility: field type 'Conta.IEstadoDaConta' is less accessible than field 'Conta.EstadoAtualDaConta'

Veja a declaração do membro IEstadoDaConta dentro da classe interface IEstadoDaConta:

interface IEstadoDaConta

Por default, quando não mencionado, a acessibilidade do membro da classe é private. Logo, a interface IEstadoDaConta é private, ou seja, só pode ser acessado pela própria classe.

Agora veja a linha que dá erro:

protected IEstadoDaConta  EstadoAtualDaConta;

Dessa vez, o membro EstadoAtualDaConta está sendo declarado com acessibilidade protected, ou seja, pode ser acessado pela própria classe OU pelas classes derivadas.

Ou seja, EstadoAtualDaConta não pode ser mais acessível do que IEstadoDaConta. Ou você reduz a acessibilidade de EstadoAtualDaConta para private ou aumenta a acessibilidade de IEstadoDaConta para protected.

Boa sorte e bons estudos!