Как получить оба значения из моего свойства для возврата в мой основной метод? - PullRequest
0 голосов
/ 06 октября 2018

Следующий код должен возвращать 2 значения, которые являются полями в свойствах WallArea и GallonsOfPaint.Это должно быть возвращено основному методу.Класс Room содержит 2 приватных метода CalcWallArea и CalcAmountOfPaint, которые устанавливают значение для двух только что упомянутых свойств.

Проблема в том, что он вернет только один из других.Я не могу заставить его вернуть оба.Результат должен быть, когда пользователь вводит длину.По ширине и высоте методы подскажут площадь помещения, а также подсчитают, сколько галлонов краски понадобится, чтобы покрасить комнату.В настоящее время при запуске он будет показывать только квадратные метры или, если я вызову второй метод, он скажет, сколько галлонов краски, но он не будет делать и то, и другое.Может кто-нибудь помочь, пожалуйста?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Array;

namespace PaintingRoomDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Room aRoom = new Room();
            string numberString;

            WriteLine("Please enter the length of the wall in feet");
            numberString = ReadLine();

            aRoom.Length = Convert.ToInt32(numberString);

            WriteLine("Please enter the width of the wall in feet");
            numberString = ReadLine();

            aRoom.Width = Convert.ToInt32(numberString);

            WriteLine("Please enter the height of the wall in feet");
            numberString = ReadLine();

            aRoom.Height = Convert.ToInt32(numberString);

            Write("The room area is: {0} and requires {1} gallons of paint",
                aRoom.WallArea, aRoom.GallonsOfPaint);
            ReadLine();
        }
    }
    class Room
    {
        private int wallArea; //These are data fields//
        private int numberOfGallonsOfPaintNeeded; //These are data fields//
        private int length; //These are data fields//
        private int width; //These are data fields//
        private int height; //These are data fields//
        private int total;
        public int Length //This is a property which provides access to the data field length
        {
            get {return length;}
            set {length = value;}
        }
        public int Width //This is a property which provides access to the data field width
        {
            get {return width;}
            set {width = value;}
        }
        public int Height //This is a property which provides access to the data field height
        {
            get {return height;}
            set { height = value; CalcWallArea();}
        }
        public int WallArea //This is a property that should return wallArea
        {
            get {return wallArea;}
        }
        public int GallonsOfPaint //This is a property that should return wallArea
        {
            get {return numberOfGallonsOfPaintNeeded;}
        }
        private void CalcWallArea() //This is a private method that needs to be called to add the value to CalcAmountOfPaint field
        {
            wallArea = (Length + Width + Length + Width) * Height;
            CalcAmountOfPaint();
        }
        private void CalcAmountOfPaint() //This is a private method that needs to be called to add the value to CalcAmountOfPaint field
        {
            if (wallArea <= 350)
                numberOfGallonsOfPaintNeeded = 1;

            int x = 1;
            if (wallArea >= 350)
                while (wallArea > 0)
                {
                    x++;
                    wallArea = wallArea - wallArea;
                    numberOfGallonsOfPaintNeeded = x;
                }
        }
    }
}

1 Ответ

0 голосов
/ 06 октября 2018

Есть несколько изменений, которые я бы порекомендовал, чтобы помочь вам получить желаемое поведение.

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

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

Что касается вашей непосредственной проблемы, то эта проблема связана с вашим методом CalcGallonsOfPaint.

while (wallArea > 0)
{
    x++;
    wallArea = wallArea - wallArea; // <- right here
    numberOfGallonsOfPaintNeeded = x;
}

Эта часть вычисления всегда будет устанавливать площадь стены равной 0, поскольку она вычитает ее полное значение из себя.Я подозреваю, что вы хотите вычесть значение 350, но вы также меняете значение поля, которое используется для возврата WallArea.По крайней мере, вы должны назначить wallArea временной переменной и вычесть ее.

Тем не менее, вероятно, лучше покончить с тем, как на состояние объекта влияют вызовы этих свойств и методов.

Для этого я бы соответствующим образом скорректировал класс вашей комнаты:

class Room
{
    public int Length {get;set;}
    public int Width {get;set;}
    public int Height {get;set;}
    public int WallArea
    {
        get {return CalcWallArea();}
    }
    public int GallonsOfPaint 
    {
        get {return CalcGallonsOfPaint();}
    }
    private int CalcWallArea()
    {
        // I am assuming this calculation is correct for your needs.
        return (Length + Width + Length + Width) * Height;
    }
    private int CalcAmountOfPaint() 
    {
        var area = WallArea;
        if (area <= 350)
            return 1;

        int x = 0;
        while (area > 0)
        {
            x++;
            area -= 350;
        }
        return x;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...