Unable to convert from decimal to double

Asked

Viewed 175 times

1

The abstract class Figura has the virtual method CalculoArea(), where the derived classes called Quadrado, Retangulo and Circunferência override this method according to its geometric figure calculation, but I find the **decimal conversion problem for double in the methods CalculoArea() class Retangulo and Circunferencia.

Code:

using static System.Console;

abstract class Figura
{
    public virtual decimal CalculoArea() => CalculoArea();
}

class Quadrado : Figura
{
    public decimal Lado { get; set; } = 0M;
    public override decimal CalculoArea() => System.Math.Pow(Lado, 4); // Erro de conversão
}

class Triangulo : Figura
{
    public decimal Altura { get; set; }
    public decimal Base { get; set; }
    public override decimal CalculoArea() => Altura * Base / 2;
}

class Circunferencia : Figura
{
    public decimal Raio { get; set; } = 0M;
    public override decimal CalculoArea() => System.Math.PI * System.Math.Pow(Raio,2); // Erro de conversão
}

class Imprimir
{
    static int Main(string[] args)
    {
        // Não usar pontos em números decimais e sim vírgulas (Exemplo 7,5 ao invéz de 7.5) 
        Quadrado quadrado = new Quadrado();
        Triangulo triangulo = new Triangulo();
        Circunferencia circulo = new Circunferencia();

        WriteLine("Classe Quadrado");
        Write("Digite o lado do quadrado: ");
        if (!decimal.TryParse(ReadLine(), out decimal digitelado)) return 1;
        quadrado.Lado = digitelado;
        WriteLine();

        WriteLine("Classe Triângulo");
        Write("Digite a altura do triângulo: ");
        if (!decimal.TryParse(ReadLine(), out decimal digitealtura)) return 1;
        triangulo.Altura = digitealtura;
        Write("Digite a base do triângulo: ");
        if (!decimal.TryParse(ReadLine(), out decimal digitebase)) return 1;
        triangulo.Base = digitebase;
        WriteLine();

        WriteLine("Classe Círculo");
        Write("Digite o raio do círculo: ");
        if (!decimal.TryParse(ReadLine(), out decimal digiteraio)) return 1;
        circulo.Raio = digiteraio;
        WriteLine();

        WriteLine($"O cálculo da área do quadrado é {quadrado.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do triângulo é {triangulo.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do círculo é {circulo.CalculoArea()}cm2");
        return 0;
    }
}

1 answer

4


Basically you have to make a cast since the method expects to send a type double and returns this same type, and the final result is indicating to be decimal:

using static System.Console;
using static System.Math;

abstract class Figura {
    public virtual decimal CalculoArea() => CalculoArea();
}

class Quadrado : Figura {
    public decimal Lado { get; set; } = 0M;
    public override decimal CalculoArea() => (decimal)Pow((double)Lado, 4);
}

class Triangulo : Figura {
    public decimal Altura { get; set; }
    public decimal Base { get; set; }
    public override decimal CalculoArea() => Altura * Base / 2;
}

class Circunferencia : Figura {
    public decimal Raio { get; set; } = 0M;
    public override decimal CalculoArea() => (decimal)(PI * Pow((double)Raio, 2));
}

class Imprimir {
    static int Main() {
        var quadrado = new Quadrado();
        var triangulo = new Triangulo();
        var circulo = new Circunferencia();
        WriteLine("Classe Quadrado");
        Write("Digite o lado do quadrado: ");
        if (!decimal.TryParse(ReadLine(), out var digitelado)) return 1;
        quadrado.Lado = digitelado;
        WriteLine();
        WriteLine("Classe Triângulo");
        Write("Digite a altura do triângulo: ");
        if (!decimal.TryParse(ReadLine(), out var digitealtura)) return 1;
        triangulo.Altura = digitealtura;
        Write("Digite a base do triângulo: ");
        if (!decimal.TryParse(ReadLine(), out var digitebase)) return 1;
        triangulo.Base = digitebase;
        WriteLine();
        WriteLine("Classe Círculo");
        Write("Digite o raio do círculo: ");
        if (!decimal.TryParse(ReadLine(), out var digiteraio)) return 1;
        circulo.Raio = digiteraio;
        WriteLine();
        WriteLine($"O cálculo da área do quadrado é {quadrado.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do triângulo é {triangulo.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do círculo é {circulo.CalculoArea()}cm2");
        return 0;
    }
}

Behold working in the ideone. And in the .NET Fiddle. Also put on the Github for future reference.

Actually, for this kind of information the decimalprobablemehte is wrong and everything should already be double:

using static System.Console;
using static System.Math;

abstract class Figura {
    public virtual double CalculoArea() => CalculoArea();
}

class Quadrado : Figura {
    public double Lado { get; set; } = 0;
    public override double CalculoArea() => Pow(Lado, 4);
}

class Triangulo : Figura {
    public double Altura { get; set; }
    public double Base { get; set; }
    public override double CalculoArea() => Altura * Base / 2;
}

class Circunferencia : Figura {
    public double Raio { get; set; } = 0;
    public override double CalculoArea() => PI * Pow(Raio, 2);
}

class Imprimir {
    static int Main() {
        var quadrado = new Quadrado();
        var triangulo = new Triangulo();
        var circulo = new Circunferencia();
        WriteLine("Classe Quadrado");
        Write("Digite o lado do quadrado: ");
        if (!double.TryParse(ReadLine(), out var digitelado)) return 1;
        quadrado.Lado = digitelado;
        WriteLine();
        WriteLine("Classe Triângulo");
        Write("Digite a altura do triângulo: ");
        if (!double.TryParse(ReadLine(), out var digitealtura)) return 1;
        triangulo.Altura = digitealtura;
        Write("Digite a base do triângulo: ");
        if (!double.TryParse(ReadLine(), out var digitebase)) return 1;
        triangulo.Base = digitebase;
        WriteLine();
        WriteLine("Classe Círculo");
        Write("Digite o raio do círculo: ");
        if (!double.TryParse(ReadLine(), out var digiteraio)) return 1;
        circulo.Raio = digiteraio;
        WriteLine();
        WriteLine($"O cálculo da área do quadrado é {quadrado.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do triângulo é {triangulo.CalculoArea()}cm2");
        WriteLine($"O cálculo da área do círculo é {circulo.CalculoArea()}cm2");
        return 0;
    }
}

Behold working in the ideone. And in the .NET Fiddle. Also put on the Github for future reference.

The question itself asks here has nothing to do with polymorphism, there is that in the code, but it’s all right in this part.

  • Polymorphism is also present in codes that use interface?

  • In a way yes, especially now that it has implementation in interface, but the problem of this question has nothing to do with polymorphism. Already have information on the subject on the website.

  • I was with this doubt when in a link I saw about when to use interface

Browser other questions tagged

You are not signed in. Login or sign up in order to post.