Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Chain Of Responsibility -> Como Implementar Exemplo do Curso?

PessoALL,

Dentro de:

  • Design Pattern I: boas práticas de programação
  • Muitos Descontos e o Chain of Responsability

Estou tentando criar o arquivo "Program.cs", pois no exemplo NÃO foi criado, mas está acusando erro..

Erro no Chain of Responsability

  • Gravidade: Erro
  • Código: CS0119
  • Descrição: "FormatoPORCENTO" é um tipo, que não é válido no contexto fornecido
using caDesignPatternChainOfResponsibility;
using caDesignPatternChainOfResponsibility.Formatos;

Conta conta1 = new("Teste1", 1000);
Conta conta2 = new("Teste2", 2000);
Conta conta3 = new("Teste2", 3000);

FormatoCSV FCSX = new FormatoCSV(FormatoXML);
FormatoXML FXML = new FormatoXML(FormatoPORCENTO);
FormatoPORCENTO FPorCento = new FormatoPORCENTO();

Montei desta forma:

INTERFACE RESPOSTA

interface Resposta
{
    public void Responde(Requisicao req, Conta conta);
}

CLASSE REQUISICAO

enum Formato
{
    XML,
    CSV,
    PORCENTO
}

class Requisicao
{
    public Formato Formato { get; private set; }

    public Requisicao(Formato formato)
    {
        this.Formato = formato;
    }
}

CLASSE CONTA

public class Conta
{
    [Required(ErrorMessage = "O saldo é obrigatório.")]
    public double Saldo { get; set; }

    [Required(ErrorMessage = "O nome do titular é obrigatório.")]
    public string? Titular { get; set; }

    /// <summary>
    /// Construtor da Classe
    /// </summary>
    /// <param name="titular">Nome do Titular</param>
    /// <param name="saldo">Saldo da Conta</param>
    public Conta(String titular, double saldo)
    {
        Titular = titular;
        Saldo = saldo;
    }
}

CLASSE FORMATOCSV

internal class FormatoCSV : IResposta
{
    public IResposta OutraResposta { get; private set; }


    public FormatoCSV(IResposta outraResposta)
    {
        OutraResposta = outraResposta;
    }

    public void Responde(Requisicao req, Conta conta)
    {
        if (req.Formato == Formato.CSV)
        {
            Console.WriteLine(conta.Titular + ";" + conta.Saldo);
        }
        else
        {
            OutraResposta.Responde(req, conta);
        }
    }
}

CLASSE FORMATOXML

internal class FormatoXML : IResposta
{
    public IResposta OutraResposta { get; private set; }

    public FormatoXML(IResposta outraResposta)
    {
        OutraResposta = outraResposta;
    }

    public void Responde(Requisicao req, Conta conta)
    {
        if (req.Formato == Formato.XML)
        {
            Console.WriteLine("<conta><titular>" + conta.Titular + "</titular><saldo>" + conta.Saldo + "</saldo></conta>");
        }
        else
        {
            OutraResposta.Responde(req, conta);
        }
    }
}

CLASSE FORMATOPORCENTO

using System.Diagnostics.CodeAnalysis;

namespace caDesignPatternChainOfResponsibility.Formatos;

internal class FormatoPORCENTO : IResposta
{
    [AllowNull]
    public IResposta OutraResposta { get; private set; }

    public FormatoPORCENTO(IResposta outraResposta)
    {
        OutraResposta = outraResposta;
    }

    public FormatoPORCENTO()
    {
        OutraResposta = null; // NÃO tem outra resposta!
    }

    public void Responde(Requisicao req, Conta conta)
    {
        if (req.Formato == Formato.PORCENTO)
        {
            Console.WriteLine(conta.Titular + "%" + conta.Saldo);
        }
        else if (OutraResposta != null)
        {
            OutraResposta.Responde(req, conta);
        }
        else
        {
            // não existe próxima na corrente, e ninguém atendeu a requisição!
            // poderíamos não ter feito nada aqui, caso não fosse necessário!
            throw new Exception("Formato de resposta não encontrado");
        }
    }
}

Agradeço qualquer ajuda.

Fabio I.

1 resposta
solução!

Olá Fabio, tudo bem?

Analisando o código fornecido, percebo que o erro ocorre porque você está tentando usar a classe "FormatoPORCENTO" antes de defini-la. Para resolver esse problema,

Tente fazer algo tipo assim:

IResposta formatoPorCento = new FormatoPORCENTO();
IResposta formatoXML = new FormatoXML(formatoPorCento);
IResposta formatoCSV = new FormatoCSV(formatoXML);

Espero ter ajudado e bons estudos!