在C#中使用getter和setter

时间:2018-07-17 20:21:05

标签: c#

我是C#的新手,想知道我在使用get和set时做错了什么。

我有一个自动售货机,当我输入想要的饮料的数字时,它会从总数中减去。

private int _coke = 2;
public int Beer = 20;
public int LemonLime = 20;
public int Grape = 20;
public int CreamSoda = 20;
public bool AnohterBevrage;

问题在于,即使达到0,它仍会继续减去。好吧,机器中不能剩下-1可乐。所以,我尝试了这个。

 public int Coke
    {
        get => _coke;
        set
        {
            if (_coke == 0)
            {
                _coke = value;
                Console.WriteLine("No more Coke Left!");
            }
        }

    }

但是它不起作用,所以我不确定在哪里卡住。我不确定Math函数是否与此处相关。

如果缺少什么,请告诉我。我会尝试调整。这个吸气剂和塞特剂让我都很困惑。

编辑:添加功能

public void Math()
    {
        var input = Console.ReadKey();

        while (input.Key == ConsoleKey.D1)
        {
            do
            {
                _coke--;
                Console.WriteLine("\nTotal Coke Left: " + Coke);

                Console.Write("\nWould You like Another Bevrage ?y/n: ");

                if (Console.ReadLine() == "y")
                {
                    AnohterBevrage = true;
                    Content();
                    Math();  
                }
                else
                {
                    AnohterBevrage = false;
                }
                break;

            } while (AnohterBevrage == true); 
        }       
    }

3 个答案:

答案 0 :(得分:5)

if (_coke == 0)

您正在检查 current 值。

这意味着您只能设置当前为0的属性。

答案 1 :(得分:1)

我想您想要这段代码,如果_coke小于0则显示消息,否则减去_coke值。

public int Coke
{
    get { return _coke; }
    set
    {
        if (_coke <= 0)
        {
            Console.WriteLine("No more Coke Left!");

        }
        else
        {
            _coke = value;
        }
    }
}

答案 2 :(得分:1)

当您开始尝试做某事时,您需要建立一个您正在做的事情的模型。使用getters / setters作为UI并不是一个很好的设计(如@Rufus L所指出的)。取而代之的是,将一台可乐机器想象成脑海。有各种各样的饮料架(可以进货),然后是一个机械系统,该机械系统实现了一个用户界面,该界面允许某人领取饮料并将其交付。您应该将设计分为这两个部分。

一个暗示您的设计需要工作的提示是,您的主要功能(即完成所有工作)被命名为“ Math”。如果要在两个月内查看这段代码,您会看到“ Math”,而没有任何线索代表可乐机器。

我写了一个满足您需求的快速炼焦机(嗯,我认为可以)。它使用相同的思维模型,一组饮料架和一个控制器。我使用一个简单的类来完成此任务,该类代表一堆饮料和一个在控制台应用程序的主例程中编写的控制器(因此所有内容都是静态的)。

RackOfBeverage类(它包含从未调用的补货方法):

class RackOfBeverages
{
    public string Label { get; }
    public int Count { get; private set; }

    public RackOfBeverages(string label, int initialCount)
    {
        Label = label;
        Count = initialCount;
    }

    public void Restock(int howMany)
    {
        Count += howMany;
    }

    public bool Dispense()
    {
        if (Count > 0)
        {
            --Count;
            return true;
        }
        else
        {
            return false;
        }
    }
}

它带有标签(表明是哪种饮料),库存/盘点和Dispense方法。如果没有酒了,Dispense调用将返回false。

然后,我编写了一个简单的控制器(作为控制台应用程序中的Main方法以及我放在Program类中的其他一些内容):

class Program
{
    private static readonly Dictionary<string, RackOfBeverages> Beverages =
        new Dictionary<string, RackOfBeverages>
        {
            {"COKE", new RackOfBeverages("Coke", 2)},
            {"SPRITE", new RackOfBeverages("Sprite", 20)},
            //etc.
        };

    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to the machine\r\nType a selection (type \"Exit\" to quit)");
        while (true)
        {
            var selection = Console.ReadLine();
            //did the user enter the name of a drink
            if (Beverages.Keys.Contains(selection, StringComparer.OrdinalIgnoreCase))
            {
                var beverage = Beverages[selection.ToUpper()];
                //was there enough to dispense a drink
                if (beverage.Dispense())
                {
                    Console.WriteLine($"Here's your {beverage.Label}");
                }
                else
                {
                    Console.WriteLine($"Sorry, no {beverage.Label} for you");
                }
            }
            //or, perhaps, the user chose to exit the app
            else if (selection.ToUpper() == "EXIT")
            {
                Console.WriteLine("Exiting");
                break;
            }
            //finally, if the user didn't enter anything I understand 
            //let him/her know and then let him/her try again
            else
            {
                Console.WriteLine("Pick a valid selection");
            }

        }

    }
}

分离应用程序中的“问题”很重要。在这里,UI与饮料存储区完全分开。如果要添加其他饮料,只需将其添加到顶部的“词典”中,UI将继续使用您添加的旧饮料和新饮料。