【发布时间】:2021-01-13 20:49:00
【问题描述】:
我想问我如何构造代码,以便当用户(主程序)指示没有苹果(hasApple = false)时,用户将无法访问fruitMenu.Apple或fruitMenu.ApplePrice。
我想让程序在没有苹果的情况下运行,那么就不会有苹果和苹果属性的价格供用户选择。
using System;
namespace ConsoleApplication
{
public class Menu
{
public class Fruit
{
public string Apple { get; set; }
public double ApplePrice { get; set; }
public string Orange { get; set; }
public double OrangePrice { get; set; }
// Constructor
public Fruit(string apple, double applePrice, string orange, double orangePrice)
{
this.Apple = apple;
this.ApplePrice = applePrice;
this.Orange = orange;
this.OrangePrice = orangePrice;
}
}
public bool HasApple { get; set; }
public bool HasOrange { get; set; }
public Fruit GetMenu()
{
string Apple;
double ApplePrice;
if (HasApple)
{
Apple = "Apple";
ApplePrice = 5;
}
else
{
Apple = "No Apple";
ApplePrice = double.NaN;
}
string Orange;
double OrangePrice;
if (HasOrange)
{
Orange = "Orange";
OrangePrice = 5;
}
else
{
Orange = "No Orange";
OrangePrice = double.NaN;
}
Fruit allFruits = new Fruit(Apple, ApplePrice, Orange, OrangePrice);
return allFruits;
}
// Constructor
public Menu(bool hasApple, bool hasOrange)
{
this.HasApple = hasApple;
this.HasOrange = hasOrange;
}
}
public class Program
{
static void Main(string[] args)
{
Menu menu = new Menu(true, false);
Menu.Fruit fruitMenu = menu.GetMenu();
Console.Write(fruitMenu.Apple);
Console.Write("\t");
Console.WriteLine(fruitMenu.ApplePrice);
Console.Write(fruitMenu.Orange);
Console.Write("\t");
Console.WriteLine(fruitMenu.OrangePrice);
Console.ReadKey();
}
}
}
【问题讨论】:
-
设计缺陷。应该有两个 Fruit 具有 Name 和 Price 属性的实例,而不是一个 Fruit 具有 Apple 和 Orange 属性的实例。
-
目前程序会输出
Apple 5 No Orange NaN。第二行是因为您为hasOrange指定了false。所以它基本上可以按您的意愿工作 - 除非您只是希望它在hasOrange为假时为空白?请说清楚。 (但是是的,我同意上述观点,您的设计并不是对 OOP 的最佳使用。)。 -
我实际上想设计成这样,如果我将 hasOrange 指定为 false,GetMenu 只会为我返回与 Apple 相关的内容。
-
因此,您可以先将
Orange = "No Orange";更改为Orange = "";。或者,如果您愿意,请在决定向控制台输出什么之前查询 HasApple 和 HasOrange 属性。例如if (fruitMenu.HasOrange) { Console.Write(fruitMenu.Orange); Console.Write("\t"); Console.WriteLine(fruitMenu.OrangePrice); }. -
我明白了,非常感谢@ADyson 的建议!