Olá, Stryker00!
Segue um exemplo de aplicação:
namespace FaturamentoCliente
{
class Program
{
static void Main(string[] args)
{
var f = new Faturamento();
var pessoaFisica = new ClientePessoaFisica();
var pessoaJuridica = new ClientePessoaJuridica();
var governo = new ClienteGoverno();
Console.WriteLine(f.Faturar(pessoaFisica));
Console.WriteLine(f.Faturar(pessoaJuridica));
Console.WriteLine(f.Faturar(governo));
}
}
public interface IFaturavel
{
double ObterDesconto();
int DiasParaPagar();
}
public class Faturamento
{
public string Faturar (IFaturavel faturavel)
{
// Aqui vai a lógica de cálculo de faturamento
return string
.Format("Este cliente possui {0} dias para pagar e recebe {1}% de desconto", faturavel.DiasParaPagar(), faturavel.ObterDesconto() * 100);
}
}
public abstract class Cliente
{
// Descreva propriedades comuns a todos clientes
// Ex: nome, endereço, telefone, etc.
}
public class ClientePessoaFisica : Cliente, IFaturavel
{
public int DiasParaPagar()
{
// 30 dias para pagar
return 30;
}
public double ObterDesconto()
{
// 15% de desconto
return 0.15;
}
}
public class ClientePessoaJuridica : Cliente, IFaturavel
{
public int DiasParaPagar()
{
// 60 dias para pagar
return 60;
}
public double ObterDesconto()
{
// 20% de desconto
return 0.20;
}
}
public class ClienteGoverno : Cliente, IFaturavel
{
public int DiasParaPagar()
{
return 0;
}
public double ObterDesconto()
{
return 0;
}
}
}
Observe que foi implementada a interface IFaturavel e que o faturamento foi baseado nela. Isso permite que você consiga criar outros clientes com outras regras de faturamento sem precisar alterar o código da classe
Faturamento. Basta fazer com que esses clientes também sejam faturáveis, como esses que estão implementados no código acima.
Observe, também, que os clientes pessoa física, jurídica e governo herdam a classe
Cliente. Faz sentido, uma vez que todos são clientes. A vantagem é que você pode escrever propriedades comuns a todos clientes dentro da classe
Cliente e, automaticamente, todos os outros tipos herdariam tais propriedades.
O bloco Try.. Catch poderia ser utilizado dentro do método Faturar, uma vez que cálculos matemáticos poderiam gerar exceções (uma divisão por zero, por exemplo).
Dependendo da implementação, a exceção de tentar ler mais clientes do que existem talvez nem ocorra. Basta saber a quantidade total de clientes a serem faturados, antes de começar o faturamento.
Espero ter ajudado!
Att, Wallace.
“First do it, then do it right, then do it better.”