簡體   English   中英

封裝和接口

[英]Encapsulation and Interfaces

幾天來,我一直在Microsoft網站上的.NET教程中研究和研究這一課。 鏈接

您可能已經知道,每節課的末尾都有“作業”。 這次,我應該使用某些新功能升級給定的項目,並實現封裝和接口。

新功能應包括:

  • 客戶擁有一個暴露其歷史訂單的財產

    //更新:已實現

  • 客戶公開添加訂單的方法

  • 嘗試添加空訂單應該什么都不做

  • 嘗試添加具有現有OrderNumber的訂單應替換現有Order(而不添加重復項)

    //我唯一成功的是刪除了以前具有相同名稱的“訂單”,而不僅僅是替換了它。

  • 訂單應公開OrderDate(可以讀取/寫入)

  • 將來嘗試添加具有OrderDate的訂單應該無濟於事

我確實設法添加了大多數這些功能。 我的項目目前( 已更新 ):

namespace ConsoleApp2
{
class Program
{
    static void Main()
    {
        Customer customer1 = new Customer("John");
        Customer customer2 = new Customer("George");
        var customers = new List<Customer>() { customer1, customer2 };
        customer1.AddOrder("car", "12/7/1999"); // will be removed due to same name
        customer1.AddOrder("vase", "20/6/2024");// will not be added to the list because of the future time
        customer1.AddOrder("car", "3/12/2014");
        customer1.AddOrder("headphones", "3/12/2022");// will not be added to the list because of the future time
        customer2.AddOrder("headphones", "10/3/2002");
        customer2.AddOrder("", "");// will not be added to the list due to empty values

        //print customers

        foreach (var customer in customers)
        {
            customer.Print();
        }
    }
}
public class Customer
{
    public string Name { get; }
    private List<Order> orders = new List<Order>();
    private List<Order> ordersHistory = new List<Order>();


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

    public void AddOrder(string name, string date)
    {
        if (name == null) { return; }
        else if (name == "" || date == "") { return; }
        else
        {
            AddHistoricOrder(name, date);
            AddRegularOrder(name, date);
        }


    }
    public void Print()
    {
        Console.WriteLine(Name);
        Console.Write("Orders: ");
        orders.ForEach(Console.Write);
        Console.WriteLine();
        Console.Write("Historic Orders: ");
        ordersHistory.ForEach(Console.Write);
        Console.WriteLine();
        Console.WriteLine($"Order Count: {orders.Count}");
        Console.WriteLine();
        Console.WriteLine();
    }

    private void AddRegularOrder(string name, string date)
    {

        if (DateTime.Parse(date) > DateTime.Now) { return; }
        else
        {

            for (int i = 0; i < orders.Count; i++)
            {
                if (orders[i].OrderName == name)
                {
                    orders.RemoveAt(i);
                }
            }
            orders.Add(new Order(name, date));

        }
    }
    private void AddHistoricOrder(string name, string date)
    {
        ordersHistory.Add(new Order(name, date));
    }
    public override string ToString()
    {
        return $"{Name}";
    }

}
public class Order
{
    public string OrderName { get; }
    public DateTime OrderDate { get; set; }

    public Order(string orderName, string date)
    {
        OrderName = orderName;
        OrderDate = DateTime.Parse(date);;
    }
    public override string ToString()
    {
        return $"{OrderName} ({OrderDate.ToShortDateString()}), ";
    }
}
}

即使我搜索並觀看了各種視頻的封裝和接口,我仍然不確定如何在此處實現這些視頻。 您能幫我提高代碼效率嗎?

我沒有實現公開歷史訂單的屬性(我不確定該怎么做)

另外,我並沒有真正理解“ New is Glue”這一課的一部分,該課說我們應該避免在代碼中添加new關鍵字,並顯示了一些使用接口的示例。 我無法在給定的LINK之外找到任何信息。我​​如何避免在此特定項目中創建新實例? 提前致謝!

  1. 客戶擁有公開其歷史訂單的屬性:只需添加吸氣劑即可公開訂單列表。

    公共列表訂單{get;} = new List();

  2. 嘗試添加空訂單應該什么都不做:

    我認為這里所需的功能是忽略空對象

     public void AddOrder(Order o){ if (o == null){ return; } //rest of your implememntaton } 

    您通過使用名稱和日期來添加訂單,而不是嘗試將Order對象傳遞給函數,為簡單起見,假設名稱是唯一標識符。

  3. 新是膠水

    除了依賴注入(無論如何,它現在只是一個流行詞)。

    他們想強調的是,“ new”關鍵字對您創建的特定類產生依賴性,因此您將來是否應該決定更改負責訂單/客戶等的類,您將不得不回到您的代碼並可能在多個位置進行修改。

    現在,有了有限的工具,您可以做的是添加一個函數,該函數可以為您創建對象,即使您正在使用“ new”功能。

    例如:

    public Order CreateNewOrder(string name, string date) { return new Order (name, date); }

沒有完美的方法可以完成某件事,總有一種更好的方法可以完成某件事,所以不必擔心擁有完美的代碼,尤其是在入門時。

我已經閱讀了該教程,並檢查了您的代碼,到目前為止我認為您做的很棒。

關於公開歷史秩序的財產,我相信這可以用不同的方式解釋,因為它太籠統了。 例如,我可以創建另一個列表,添加客戶要求的每個訂單,而不必擔心日期,名稱或是否為空。

另一種方法是將另一個列表添加為主列表,不同的是,如果您添加具有相同名稱的訂單,它將存儲該列表而不會刪​​除前一個列表,因為它是歷史記錄。

你可以做這樣的事情。

public class Customer
{
    public string Name { get; }
    private List<Order> orders = new List<Order>();
    public List<Order> historicOrders = new List<Order>();


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

    public void AddOrder(string name, string date)
    {
        if (name == "" || date == "" ) ;
        else if (DateTime.Parse(date) > DateTime.Now) ; 
        else
        {

            for (int i = 0; i < orders.Count; i++)
            {
                if (orders[i].OrderName == name)
                {
                    orders.RemoveAt(i);
                }
            }
            orders.Add(new Order(name, date));
            historicOrders.Add(new Order(name, date));

        }
    }

    public void Print()
    {
        Console.WriteLine(Name);
        Console.Write("Orders: ");
        orders.ForEach(Console.Write);
        Console.WriteLine();
        Console.WriteLine($"Order Count: {orders.Count}");
        Console.WriteLine();
        Console.WriteLine();
    }
    public override string ToString()
    {
        return $"{Name}";
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM