[英]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之外找到任何信息。我如何避免在此特定項目中創建新實例? 提前致謝!
客戶擁有公開其歷史訂單的屬性:只需添加吸氣劑即可公開訂單列表。
公共列表訂單{get;} = new List();
嘗試添加空訂單應該什么都不做:
我認為這里所需的功能是忽略空對象
public void AddOrder(Order o){ if (o == null){ return; } //rest of your implememntaton }
您通過使用名稱和日期來添加訂單,而不是嘗試將Order對象傳遞給函數,為簡單起見,假設名稱是唯一標識符。
新是膠水
除了依賴注入(無論如何,它現在只是一個流行詞)。
他們想強調的是,“ 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.