1
resposta

Desafio 04: Interfaces

  • IForma com Circulo e Retângulo:
internal interface IForma
{
    public double CalcularArea();
    public double CalcularPerimetro();
}
namespace DesafioInterfaces.Ex01;

internal class Circulo: IForma
{
    public double Raio;

    public Circulo(int raio)
    {
        Raio = raio;
    }

    public double CalcularArea()
    {
        double Area = Math.PI * (Raio*Raio);
        return Area;
    }
  public double CalcularPerimetro()
    {
        double Perimetro = Raio * (Math.PI * 2);
        return Perimetro;
    }
}
namespace DesafioInterfaces.Ex01;

internal class Retangulo : IForma
{
    public double BaseRetangulo;
    public double Altura;

    public Retangulo(double baseRetangulo, double altura)
    {
        BaseRetangulo = baseRetangulo;
        Altura = altura;
    }

    public double CalcularArea()
    {
        double Area = BaseRetangulo * Altura;
        return Area;
    }

    public double CalcularPerimetro()
    {
        double Perimetro = BaseRetangulo * 2 + Altura * 2;
        return Perimetro;
    }
}
  • IPilotavel e IVoavel com Veiculo:
internal interface IVoavel
{
    public string Voar();
}
internal interface IPilotavel
{
    public string Pilotar();
}
internal class Veiculo : IPilotavel, IVoavel
{
    public string Pilotar()
    {
        return $"Pilotando veículo...";
    }

    public string Voar()
    {
        return $"Veículo voando...";
    }
}
  • IPagavel com Produto e Servico:
internal interface IPagavel
{
    public decimal CalcularPagamento();
}
class Produto : IPagavel
{
    public decimal ValorProduto;
    public int Quantidade;
    public decimal ValorTotal = 0;

    public Produto(decimal valorProduto, int quantidade)
    {
        ValorProduto = valorProduto;
        Quantidade = quantidade;
    }

    public decimal CalcularPagamento()
    {
        ValorTotal = Quantidade * ValorProduto;
        return ValorTotal;
    }
}
class Servico : IPagavel
{
    public decimal ValorServico;
    public int HorasTrabalhadas;
    public decimal ValorTotal = 0;

    public Servico(decimal valorServico, int horasTrabalhadas)
    {
        ValorServico = valorServico;
        HorasTrabalhadas = horasTrabalhadas;
    }

    public decimal CalcularPagamento()
    {
        ValorTotal = ValorServico * HorasTrabalhadas;
        return ValorTotal;
    }
}
  • INotificavel com Email e SMS:
internal interface INotificavel
{
    public string EnviarNotificacao();
}
internal class Email : INotificavel
{
    public string EnviarNotificacao()
    {
        return $"Notificação enviada por e-mail.";
    } 
}
internal class Sms : INotificavel
{
    public string EnviarNotificacao()
    {
        return $"Notificação enviada por SMS.";
    }
}
  • IArmazenavel com Banco de Dados e Arquivo:
internal interface IArmazenavel
{
    public string Salvar();
    public string Recuperar();
}
internal class Arquivo : IArmazenavel
{
    public string NomeArquivo;

    public Arquivo(string nomeArquivo)
    {
        NomeArquivo = nomeArquivo;
    }

    public string Recuperar()
    {
        return $"Recuperando arquivo {NomeArquivo}...";
    }

    public string Salvar()
    {
        return $"Salvando arquivo {NomeArquivo}...";
    }
}
internal class BancoDados : IArmazenavel
{
    public string NomeBanco;

    public BancoDados(string nomeBanco)
    {
        NomeBanco = nomeBanco;
    }

    public string Recuperar()
    {
        return $"Executando SELECT no banco {NomeBanco}...";
    }

    public string Salvar()
    {
        return $"Executando INSERT no banco {NomeBanco}...";
    }
}
1 resposta

Oi, Paulo! Como vai?

Você aplicou muito bem as interfaces para separar responsabilidades, usando IForma, IPagavel e INotificavel de forma clara, mantendo cada classe focada em um comportamento específico, o que reforça bem o conceito de polimorfismo.

Uma dica interessante para o futuro é usar propriedades em vez de campos públicos, facilitando encapsulamento e validações simples:


public double Raio { get; private set; }

public Circulo(double raio)
{
    Raio = raio;
}

Esse código define uma propriedade controlada, evitando alterações diretas no valor do raio após a criação do objeto.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!