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

Modelo de classes utilizado para resolução do desafio

Tenho uma dúvida sobre o modelo que pensei para executar o desafio. Se pode ser considerada melhor, ou se já foge da ideia do que foi instruido nas aulas passadas (polimorfismo e etc)?

Segue código:

namespace desafio_01_12.Utilities
{
    public static class OperacoesMatematicas
    {
        public static double Somar(double numero1, double numero2)
        {
            return numero1 + numero2;
        }
        public static double Subtrair(double numero1, double numero2)
        {
            return numero1 - numero2;
        }
        public static double Multiplicar(double numero1, double numero2)
        {
            return numero1 * numero2;
        }
        public static double Dividir(double dividendo, double divisor)
        {
            if (divisor == 0)
                throw new ArgumentException("O divisor não pode ser 0.");

            return dividendo / divisor;
        }
    }
}
var numero1 = 4;
var numero2 = 2;

var soma = OperacoesMatematicas.Somar(numero1, numero2);
var multi = OperacoesMatematicas.Multiplicar(numero1, numero2);
var subtr = OperacoesMatematicas.Subtrair(numero1, numero2);
var divisao = OperacoesMatematicas.Dividir(numero1, numero2);

Console.WriteLine(soma);
Console.WriteLine(multi);
Console.WriteLine(subtr);
Console.WriteLine(divisao);

Att.

2 respostas
solução!

Jean, teoricamente vc não está usando o conceito de polimorfismo, pois vc está apenas com um objeto que tem vários métodos.

A ideia do polimorfismo é que você tenha um único objeto que pode assumir várias formas.

Olha este exemplo:

using System;

namespace ConsoleApp1
{
    class Program
    {
        public interface IOperacoesMatematicas
        {
            public string GetDescricao();
            public double Calcular(double num1, double num2);
        }

        // Implementa a interface;
        public class Somar : IOperacoesMatematicas
        {
            public string GetDescricao()
            {
                return "Somar";
            }
            public double Calcular(double num1, double num2)
            {
                return num1 + num2;
            }
        }

        // Implementa a interface;
        public class Subtrair : IOperacoesMatematicas
        {
            public string GetDescricao()
            {
                return "Subtrair";
            }
            public double Calcular(double num1, double num2)
            {
                return num1 - num2;
            }
        }

        static void Main(string[] args)
        {
            // Colocamos todas as possíveis opções de objetos que podem ser instanciados:
            IOperacoesMatematicas[] operacoesDisponiveis = { new Somar(), new Subtrair() };

            Console.WriteLine("Digite o primeiro número:");
            double num1 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Digite o segundo número:");
            double num2 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Digite o número da operação desejada, sendo:");

            // A partir deste ponto, já começamos a aplicar o conceito de polimorfismo,
            // dado que o método "GetDescricao()" só consegue ser chamado porque pertence
            // a qualquer uma das formas que ele assuma, seja somar ou subtrair.
            for (int i = 0; i < operacoesDisponiveis.Length; i++)
                Console.WriteLine(i + " - " + operacoesDisponiveis[i].GetDescricao());
            int operacaoEscolhida = Convert.ToInt32(Console.ReadLine());

            // Se a operação escolhida não existir, fecha a aplicação.
            if (operacaoEscolhida > operacoesDisponiveis.Length)
            {
                Console.WriteLine("Operação inválida");
                Environment.Exit(1);
            }
            // A depender do valor que o usuário informar, o objeto "resultado" vai obter
            // instâncias diferentes (formas diferentes/polimorfismo), mas não teremos
            // erro na aplicação por conta disto.
            IOperacoesMatematicas resultado = operacoesDisponiveis[operacaoEscolhida];


            // Observar que neste ponto, o comportamento será dado pelo 
            Console.WriteLine("O resultado é :" + resultado.Calcular(num1, num2));
        }
    }
}

Com isto, perceba que IOperacoesMatematicas pode assumir comportamentos diferentes, a depender da forma como ele foi instanciado, ou seja, um outro exemplo básico seria o seguinte:

static void Main(string[] args)
        {
            double num1 = 5;
            double num2 = 4;
            IOperacoesMatematicas operacao = new Somar();
            Console.WriteLine(operacao.Calcular(num1, num2));
            operacao = new Subtrair();
            Console.WriteLine(operacao.Calcular(num1, num2));
        }

Observe que IOperacoesMatematicas está se comportando de forma diferentes, mas não deixa de ser "IOperacoesMatematicas".

Bom dia,

Olá Jean, muito bacana você pensar e analisar outras opções. E Ronaldo, muito obrigado pela contribuição ficou muito bom, parabéns!