【问题标题】:C# how to refer to objects inside a methodC#如何引用方法内的对象
【发布时间】:2021-12-15 20:19:13
【问题描述】:

所以我需要在这个类中创建一个名为“store”的类,我需要一个名为“start”的方法,现在在所述方法中我需要从不同的类创建 9 个对象。然后我需要在主程序中调用所述方法,并在调用消息后能够引用所述创建的对象。

class Store
{
    public void start()
    {
        Pizza vesuvio = new Pizza("Vesuvio", 75, "Tomato", "Cheese", "Ham");
        Pizza vegetarian = new Pizza("Vegetarian", 80, "Tomato", "cheese", "vegetables");
        Pizza contadina = new Pizza("Containda", 75, "Tomato", "cheese", "mushrooms", "olives");

        Customer victor = new Customer("Victor", "Hansen");
        Customer jacob = new Customer("Jacob", "Pedersen");
        Customer maghrete = new Customer("Maghrete", "Ingrid");

        Order victorOrdre = new Order(vesuvio.PizzaPrice, 1.25, vesuvio.PizzaPrice * 1.25);
        Order jacobOrdre = new Order(vegetarian.PizzaPrice, 1.25, vegetarian.PizzaPrice * 1.25);
        Order maghreteOrdre = new Order(contadina.PizzaPrice, 1.25, contadina.PizzaPrice * 1.25);
        return;
    }
}

这是我创建的方法,但无论我返回什么或将类型更改为什么,我似乎都无法在主程序中调用该方法。 这是我被指示做的事情

  1. 要测试您的应用程序,您应该使用 Start 方法创建一个 Store 类。
  2. 从类 Program 中的 main 方法调用 Start 方法。
  3. 在 Start 方法中,您应该:
  4. 创建 3 个 Pizza 对象、3 个 Customer 对象和 3 个 Order 对象,每个对象都有不同的披萨。
  5. 打印订单信息
  6. 使用每个 Order 对象的对象引用,您应该打印出每个订单的披萨名称、客户名称和总价。
public class Order
{
    // instance fields

    private double _tax;
    private int _priceBeforeTaxes;
    private double _totalPrice;

    //properties

    public double Tax
    {
        get { return _tax; }
        set { _tax = 0.25; }

    }

    public int PriceBeforeTaxes
    {
        get { return _priceBeforeTaxes; }
    }

    public double TotalPrice
    {
        get { return _totalPrice; }
    }

    //constructor
    public Order(int priceBeforeTax, double tax, double totalPrice)
    {
        _priceBeforeTaxes = priceBeforeTax;
        _tax = tax;
        _totalPrice = totalPrice;
    }

    //methods

    public override string ToString()
    {
        string obj = $"order total before taxes is {PriceBeforeTaxes} with taxes of 25% is equal to {TotalPrice} ";
        return obj;
    }

    public double CalculateTotalPrice(int PriceBeforeTaxes, double Tax)
    {
        double CalculatedTotalPrice = PriceBeforeTaxes * Tax;
        return CalculatedTotalPrice;

    }
}

public class Pizza
{

    private string _pizzaName;
    public int _pizzaPrice;
    private string _pizzaToppings1;
    private string _pizzaToppings2;
    private string _pizzaToppings3;
    private string _pizzaToppings4;

    //Properties
    public string PizzaName
    {
        get { return _pizzaName; }
    }

    public int PizzaPrice
    {
        get { return _pizzaPrice; }
    }

    public string PizzaToppings1
    {
        get { return _pizzaToppings1; }
    }

    public string PizzaToppings2
    {
        get { return _pizzaToppings2; }
    }
    public string PizzaToppings3
    {
        get { return _pizzaToppings3; }
    }
    public string PizzaToppings4
    {
        get { return _pizzaToppings4; }
    }

    //constructor
    public Pizza(string pizzaName, int pizzaPrice, string pizzaToppings1, string pizzaToppings2, string pizzaToppings3)
    {
        _pizzaName = pizzaName;
        _pizzaPrice = pizzaPrice;
        _pizzaToppings1 = pizzaToppings1;
        _pizzaToppings2 = pizzaToppings2;
        _pizzaToppings3 = pizzaToppings3;
    }

    public Pizza(string pizzaName, int pizzaPrice, string pizzaToppings1, string pizzaToppings2, string pizzaToppings3, string pizzaToppings4)
    {
        _pizzaName = pizzaName;
        _pizzaPrice = pizzaPrice;
        _pizzaToppings1 = pizzaToppings1;
        _pizzaToppings2 = pizzaToppings2;
        _pizzaToppings3 = pizzaToppings3;
        _pizzaToppings4 = pizzaToppings4;
    }

    //method
    public override string ToString()
    {
        string obj = $"{PizzaName} with {PizzaToppings1}, {PizzaToppings2}, {PizzaToppings3}, {PizzaToppings4} costs {PizzaPrice}kr";
        return obj;
    }


}

public class Customer
{

    private string _customerFirstName;
    private int _customerNumber;
    private string _customerAddress;
    private string _customerLastName;

    //properties
    public string CustomerFirstName
    {
        get { return _customerFirstName; }
        set { _customerFirstName = value; }
    }

    public string CustomerLastName
    {
        get { return _customerLastName; }
        set { _customerLastName = value; }
    }

    public int CustomerNumber
    {
        get { return _customerNumber; }
        set { _customerNumber = value; }
    }

    public string CustomerAddress
    {
        get { return _customerAddress; }
        set { _customerAddress = value; }
    }

    //constructor
    public Customer(string CustomerFirstName, string CustomerLastName, int CustomerNumber, string CustomerAddress)
    {
        _customerFirstName = CustomerFirstName;
        _customerNumber = CustomerNumber;
        _customerAddress = CustomerAddress;
        _customerLastName = CustomerLastName;

        if (CustomerNumber < 100000000 && CustomerNumber > 9999999)
        {
        }
        else
        {
            Console.WriteLine("this is not a valid phone number, valid phone number must be 8 digits. Please try again.");
        }
    }

    //methods
    public override string ToString()
    {
        string obj = $"{CustomerFirstName}, {CustomerLastName}, \n{CustomerNumber}, \n{CustomerAddress}";
        return obj;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Store store = new Store();
        store.start();
    }
}

这就是我应该调用方法并引用我在方法中创建的对象的地方。

【问题讨论】:

  • 调用start方法的main代码在哪里? PizzaCustomerOrder 类在哪里?我建议您仔细阅读 SO tour 部分,因为它显示了 SO 的工作原理。 How to Ask 部分可能会有所帮助。此外,您可能会发现 SO Asking 部分很有用。
  • 你能发布你的课程吗
  • 您从哪里获得这些课程?是您自己创建的吗?
  • 是的,我自己创建了它们。我是学生,这是我们作业的一部分。
  • 如果行首至少有四个空格,则代码格式为单声道。这就是为什么您的命名空间部分看起来像普通单词的原因。您可以使用鼠标突出显示代码并单击文本框上方的{} 按钮。这将全部缩进 4 个空格,为突出显示的文本启用代码块

标签: c# object methods


【解决方案1】:

如果您使用的是 Visual Studio,则可以直接创建一个类。这篇 MSDN 文章(似乎正是您正在寻找的内容)更深入地介绍了如何创建和使用类。查看示例部分:https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/types/classes

下面我对您的每个要求进行了更深入的介绍。


  1. 要测试您的应用程序,您应该使用 Start 方法创建一个 Store 类。
namespace PizzaStore
{
    public class Store
    {
        public void Start()
        {
            // Create 3 Pizza objects
            // Create 3 Customer objects
            // Create 3 Order objects each with a different pizza.
        }
    }
}
  1. 从类 Program 中的 main 方法调用 Start 方法。

找到名为Program.cs 的文件,如果您使用的是新的.NET 6 框架,那么这个文件看起来会有所不同。否则,如果您使用的是 .Net Framework 4.x,那么它应该看起来像一个传统类。有关详细信息,请参阅此 MSDN 文档:https://docs.microsoft.com/en-gb/dotnet/core/tutorials/top-level-templates

要调用Start() 函数,您需要创建Store 对象的新实例,然后通过引用该实例调用该函数。

Store store = new Store();
store.Start();

如果您决定使用此代码,则需要确保在文件顶部包含 using 语句。您可以在此处找到有关命名空间的更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/types/namespaces

命名空间:

using PizzaStore;

否则你将不得不引用包含命名空间的类。

PizzaStore.Store store = new PizzaStore.Store();
store.Start();
  1. 和 4. 在 Start 方法中,您应该: 创建 3 个 Pizza 对象、3 个 Customer 对象和 3 个 Order 对象,每个对象都有不同的 Pizza。

您似乎已经创建了对象。据我所知,您所做的在创建对象方面是正确的。您可以通过不同的方式设置变量(例如使用属性:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-properties),但是您通过初始化构造函数中的值所做的一切都很好。

我建议的唯一改进是删除函数末尾的return;。这没有任何用处,可能会造成混淆。

  1. 和 6. 打印订单信息:使用每个 Order 对象的对象引用,您应该打印每个订单的披萨名称、客户名称和总价。

我假设您正在使用控制台项目。在这种情况下,写入控制台很简单。

要写一行,你可以使用:

Console.WriteLine("Hello, World!");

要在不创建新行的情况下编写内容,您可以使用:

Console.Write("Hello, World!");

为了引用您创建的每个对象,就像使用您为它们创建的声明变量名一样简单,例如:

Console.WriteLine(vesuvio.PizzaName);

您的任务的最终要求将需要您修改当前拥有的代码。创建订单时,您需要输入有助于识别订单的数据。

现在,你知道披萨的价格,我假设的是税率和最终总价。

很遗憾,这并不能帮助我们识别订单,因为我们无法确定所订购的比萨饼是什么类型的,以及是谁点了比萨饼。因此,您需要在订单中添加这两个关键数据部分。

我建议在 Order 类中为您创建的对象添加一个属性:

  • 披萨
  • 客户

您可以像创建要传递给构造函数的字符串和数字一样执行此操作。但请确保它存储在类中,而不仅仅是传递给构造函数。

例如,您的 Customer 类看起来像这样:

public class Custumer
{
    public Custumer(string name, string surname)
    {
        CustomerName = name;
        CustomerSurname = surname;
    }

    public string CustomerName { get; set; }
    public string CustomerSurname { get; set; }

}

你的 Order 类看起来像这样:

public class Order
{
    public Order(double price, Customer customer)
    {
        OrderPrice = price;
        OrderCustomer = customer;
    }

    public double OrderPrice { get; set; }
    public Customer OrderCustomer { get; set; }
}

您可以通过执行以下操作来引用订单客户:

victorOrdre.OrderCustomer.CustomerName;

您似乎已使用代码更新了答案。这对于确定如何帮助您非常有帮助。关于您的更新,很明显您对类和属性有很好的了解。

对于 Pizza 类,我建议您使用包含一系列披萨配料的列表。这样您就不需要为每个浇头创建一个新变量。

public class Pizza
{
    public Pizza(string name, double price, params string[] args)
    {
        PizzaName = name;
        PizzaPrice = price;
        PizzaIngredients = new List<string>();

        foreach (var item in args)
        {
            PizzaIngredients.Add(item);
        }
    }

    public string PizzaName { get; set; }
    public double PizzaPrice { get; set; }
    public List<string> PizzaIngredients { get; set; }
}

【讨论】:

  • 我建议删除第一段。另外,class Costumer中的拼写错误
  • 感谢您的深入回答,但遗憾的是这似乎并没有解决我的问题。我仍然无法引用我的 program.cs 中的对象。我在 using System 下添加了 using PizzaStore,但似乎仍然没有帮助。
  • 您遇到了什么错误?不幸的是,如果我要做的只是“它不起作用”或“似乎没有帮助”,那么我无法提供更多帮助。在大多数情况下,在线搜索编译器错误就可以找到许多有解决方案的文章。
  • vesuvio 是方法范围变量。您将无法引用它,因为它会在您调用 start 函数后立即被处理掉。变量范围见这篇文章:geeksforgeeks.org/scope-of-variables-in-c-sharp
  • 我很抱歉我的错误,这是我第一次来这里。感谢您,我现在已经弄清楚了如何解决我的问题,因此我希望感谢您的耐心等待,我一定会利用与您交谈的经验来改善我在本网站上的礼仪以及未来的问题和我会跟进。
【解决方案2】:

根据您发布的说明,在我看来,获得满分所需的只是以下内容:

class Program
{
    static void Main(string[] args)
    {
        Store store = new Store();
        store.Start();
    }
}

public class Store
{
    public void Start()
    {
        Order[] orders = new []
        {
            new Order(new Customer("Victor Hansen"), new Pizza("Vesuvio", 75m)),
            new Order(new Customer("Jacob Pedersen"), new Pizza("Vegetarian", 80m)),
            new Order(new Customer("Maghrete Ingrid"), new Pizza("Containda", 75m)),
        };

        foreach (Order order in orders)
        {
            Console.WriteLine($"{order.Customer.Name} has ordered {order.Pizza.Name} costing {order.Pizza.Price}.");
        }
    }
}

public class Order
{
    public Customer Customer { get; private set; }
    public Pizza Pizza { get; private set; }

    public Order(Customer customer, Pizza pizza)
    {
        this.Customer = customer;
        this.Pizza = pizza;
    }
}

public class Pizza
{
    public string Name { get; private set; }
    public decimal Price { get; private set; }

    public Pizza(string name, decimal price)
    {
        this.Name = name;
        this.Price = price;
    }
}

public class Customer
{
    public string Name { get; private set; }

    public Customer(string name)
    {
        this.Name = name;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多