Вызов методов из одного класса в другой?

c# asp.net

58 просмотра

2 ответа

У меня есть два класса. Один содержит данные и поведение. Другой только для ввода и отображения данных. Когда я вызываю методы одного класса из другого для отображения результата, он возвращает ноль.

Любая помощь ... спасибо

Данные и поведение:

class CalculateArea
{
    private const double PI = 3.14;
    private double cirArea;
    private double recArea;
    private double cilArea;
    private double radius;
    private double length, width;
    private int height;

    // Constructors
    public CalculateArea(double radius1) 
    {
        radius = radius1;
    }
    public double CalculateCircleArea()
    {
        cirArea = (PI * (radius * radius));
        return cirArea;
    }

    public CalculateArea(int height1) 
    {
        height = height1;
    }

    public CalculateArea(double lenght1 , double width1) 
    {
        length = lenght1;
        width = width1;

    }

    //public CalculateArea()
    //{
        // TODO: Complete member initialization
    //}

    // methods


    //
    public double CalculateRectangleArea() 
    {
        recArea = (length * width);
        return recArea;
    }
    //
    public double CalculateCylinderArea() 
    {
        cilArea = (PI * (radius * radius) * height);
        return cilArea;
    }
}

Ввод и отображение:

class Program
{
    static void Main(string[] args)
    {
        string number;
        Console.WriteLine("Which figure do you want to see calculated select a number");
        Console.WriteLine("Circle : 1");
        Console.WriteLine("Rectangle : 2");
        Console.WriteLine("Cylinder : 3");

        number= Console.ReadLine();
        int numb=Convert.ToInt32(number);

        if (numb == 1) 
        {
            Console.WriteLine("Enter the radius for circle");
            string rad;
            rad = Console.ReadLine();
            int radiusX = Convert.ToInt32(rad);
            CalculateArea newCal1 = new CalculateArea(radiusX);
            Console.WriteLine("The result of calculation is {0}", newCal1.CalculateCircleArea());
        }

        else if(numb == 2)
        {
            Console.WriteLine("Enter the length ");
            number = Console.ReadLine();
            double lenght;
            lenght = Convert.ToDouble(number);
            Console.WriteLine("Enter the width ");
            number = Console.ReadLine();
            double width;
            width = Convert.ToDouble(number);
            CalculateArea newCal2=new CalculateArea(lenght , width);
            Console.WriteLine("The result of calculation is {0}" , newCal2.CalculateRectangleArea());
        }

        else if (numb == 3)
        {
            Console.WriteLine("Enter the height ");
            number = Console.ReadLine();
            int height;
            height = Convert.ToInt32(number);
            Console.WriteLine("Enter the radius");
            number = Console.ReadLine();
            int radius;
            radius = Convert.ToInt32(number);
            CalculateArea newCal3 = new CalculateArea(height, radius);
            Console.WriteLine("The reslut of calculation is {0}", newCal3.CalculateCylinderArea());
        }

        else 
        {
            Console.WriteLine("There is no any calculation number check the information and try again");
        }

        Console.ReadLine();

    }
Автор: jawed Источник Размещён: 08.11.2019 11:24

Ответы (2)


2 плюса

Решение

Следующий код:

CalculateArea newCal1 = new CalculateArea(radiusX);

Вызывает следующий конструктор:

public CalculateArea(int height1) 
{
    height = height1;
}

Потому что radiusX является целым ...

Таким образом, значение сохраняется в высоте, а не в радиусе. Таким образом, когда вы вызываете метод для вычисления площади круга, он вычисляет с использованием радиуса, который по-прежнему равен 0,0.

CalculateCylinderArea использует также радиус и высоту, но ваш конструктор принимает только два параметра, высоту и ширину. Таким образом, в методе 3 он также «терпит неудачу», так как радиус и ширина - 0.0

Вычисление прямоугольника работает.

Чтобы решить проблему с кружком, нужно изменить переменную raiusX на double.

Например, чтобы решить проблему с цилиндром, вы можете изменить процедуру, чтобы использовать длину и ширину вместо радиуса и высоты.

Но как примечание, есть еще лучшие способы сделать то, что вы пытаетесь сделать :)

Автор: Jauch Размещён: 20.08.2016 02:27

0 плюса

В дополнение к тому, что ответ @ Jauch, я хотел бы дать дополнительную информацию.

Если несколько методов в типе (классе или структуре) имеют одно и то же имя, они называются перегруженными. Это допустимо только в том случае, если у них разные формальные списки параметров. Имена параметров не имеют значения; только их количество и их типы. Также тип возвращаемого значения не имеет значения.

Ваша проблема связана с разрешением перегрузки . Это то, что делает C #, чтобы выяснить, какая перегруженная версия должна быть вызвана. Важно понимать, что это происходит во время компиляции, а не во время выполнения. Подразумевается, что конкретные передаваемые значения не имеют значения, поскольку они не известны во время компиляции. Только типы фактических аргументов имеют значение.

Пожалуйста, перейдите по ссылке выше для спецификации, но статья Джона Скита, вероятно, более удобочитаема: C # in Depth: Overloading .

Автор: Olivier Jacot-Descombes Размещён: 20.08.2016 03:14
Вопросы из категории :
32x32