C # разница между переменными-членами и аргументами, передаваемыми методу - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю над заданием с очень конкретными инструкциями, которые, если это будет интересно, я опубликую под кодом, который я создал.Но, короче говоря, я должен создать абстрактный класс BasicShape, а также подклассы Circle и Rectangle.У каждого подкласса есть метод расчета площади фигуры.площадь рассчитывается с использованием переменных-членов.Однако в моем коде ниже этим переменным-членам никогда не присваивается значение.Я не совсем понимаю, как их назначить, потому что методы Circle и Rectangle также требуют, чтобы им передавались аргументы.Эти аргументы x, y, r для Circle и w, l для Rectangle указываются в основной программе при создании нового экземпляра фигуры, но эти значения также кажутсяничего не делать, поскольку вывод всегда равен 0. Какое отношение имеют аргументы, передаваемые в методы, к переменным-членам?Как получается, что переменным-членам должны быть присвоены значения, когда значения задаются через аргументы, заданные при вызове экземпляра Circle или Rectangle?

Вот мой код:

abstract class BasicShape
{
    protected double area;

    public double getArea()
    {
        Console.WriteLine("Area: {0}", area);
        return area;
    }

    public virtual void calcArea()
    {

    }
}

class Circle : BasicShape
{
    private int centerX;
    private int centerY;
    private double radius;

    public Circle(int x, int y, double r)
    {
        calcArea();
    }      


    public int genCenterX()
    {
        return centerX;
    }

    public int genCenterY()
    {
        return centerY;
    }

    public override void calcArea()
    {
        area = 3.14159 * radius * radius;
        Console.WriteLine("The area of the circle is: {0}", area);
    }

}

class Rectangle : BasicShape
{
    private int width;
    private int length;

    public Rectangle(int w, int l)
    {
        calcArea();
    }

    public int getWidth()
    {
        return width;
    }

    public int getLength()
    {
        return length;
    }

    public override void calcArea()
    {
        area = length * width;
        Console.WriteLine("The area of the rectangle is: {0}", area);
    }
}

public class TestShapes
{
    static void Main(string[] args)
    {
        Circle circle1 = new Circle(2, 2, 5);
        Rectangle rectangle = new Rectangle(6, 7);

        Console.ReadLine();
    }
}

Вот инструкции для назначения:

Определите чистый абстрактный базовый класс с именем BasicShape.Класс BasicShape должен иметь следующие члены:

Переменная закрытого члена: area, двойник, используемый для хранения области фигуры.

Методы открытого члена: getArea (): Этот метод должен возвращать значениев области переменных члена.calcArea (): этот метод должен быть чисто виртуальным.

Далее определите класс с именем Circle.Он должен быть производным от класса BasicShape.Он должен иметь следующие члены:

Переменная закрытого члена: centerX, целое число, используемое для хранения координаты x центра круга.centerY, целое число, используемое для хранения координаты y центра круга.radius, double, используемый для хранения радиуса круга.

Методы открытого члена:

Circle (int x, int y, int r): принимает значения для centerX, centerY и radius.Должен вызвать переопределенный метод calcArea, описанный ниже.

genCenterX: вернул значение в centerX

genCenterY: вернул значение в centerY

calcArea (): вычисляет площадь областиокружность (область = 3.14159 * радиус * радиус) и сохранить результат в унаследованной области члена.

Затем определите класс с именем Rectangle.Он должен быть производным от класса BasicShape.Он должен иметь следующие члены: Переменная закрытого члена:

width, целое число, используемое для хранения ширины длины прямоугольника, целое число, используемое для хранения длины прямоугольника

Public Member Methods:

Прямоугольник (int w, int l): принимает значения ширины и длины.Должен вызывать переопределенный метод calcArea, описанный ниже.

getWidth (): возвращает значение по ширине.getLength (): возвращает значение длины. calcArea (): вычисляет площадь круга (area = length * width) и сохраняет результат в унаследованной области члена.

После создания этих классов создайтеосновная программа, которая определила объект Circle и объект Rectangle.

Продемонстрируйте, что каждый объект правильно рассчитывает и сообщает свою площадь.

1 Ответ

0 голосов
/ 11 ноября 2018

Вы не присваиваете значения, переданные конструктором, вашим переменным-членам. Поэтому, когда вы вызываете calcArea , вы выполняете его, используя значения по умолчанию для типов int или double (что равно нулю)

class Circle : BasicShape
{
    private int centerX;
    private int centerY;
    private double radius;

    public Circle(int x, int y, double r)
    {
        radius = r;
        // Now you are executing the calcArea using the value passed in
        calcArea();
    }      
    ....
}

class Rectangle : BasicShape
{
    private int width;
    private int length;

    public Rectangle(int w, int l)
    {
        width = w;
        length = l;
        calcArea();
    }
    ....
}

Переопределение calcArea требует, чтобы переменные-члены были установлены в нечто иное, в противном случае эти переменные-члены инициализируются с их значениями по умолчанию (ноль как в целых, так и в двойных), и, таким образом, метод не может дать значимый результат.

...