C# 封装和接口
几天来,我一直在微软网站上的.NET教程中研究这节课。 正如你可能已经知道的,每节课的最后都有一个“家庭作业”。 这次我应该用一些新特性升级给定的项目,并实现封装和接口 新功能应包括:C# 封装和接口,c#,interface,encapsulation,C#,Interface,Encapsulation,几天来,我一直在微软网站上的.NET教程中研究这节课。 正如你可能已经知道的,每节课的最后都有一个“家庭作业”。 这次我应该用一些新特性升级给定的项目,并实现封装和接口 新功能应包括: 客户有一个公开其历史订单的属性 //更新:已实施 客户公开了添加订单的方法 尝试添加空订单不应执行任何操作 尝试添加具有现有订单号的订单应替换现有订单(而不是添加重复订单) //我成功的唯一一件事是删除了以前同名的“订单”,而不是仅仅替换它。 订单应公开OrderDate(可以读/写) 尝试在将来添加带有Or
- 客户有一个公开其历史订单的属性 //更新:已实施
- 客户公开了添加订单的方法
- 尝试添加空订单不应执行任何操作
- 尝试添加具有现有订单号的订单应替换现有订单(而不是添加重复订单) //我成功的唯一一件事是删除了以前同名的“订单”,而不是仅仅替换它。
- 订单应公开OrderDate(可以读/写)
- 尝试在将来添加带有OrderDate的订单不会起任何作用
namespace ConsoleApp2
{
班级计划
{
静态void Main()
{
客户1=新客户(“约翰”);
客户2=新客户(“乔治”);
var customers=new List(){customer1,customer2};
customer1.AddOrder(“car”,“12/7/1999”);//由于名称相同,将被删除
customer1.AddOrder(“vase”,“20/6/2024”);//由于未来时间的原因,将不会添加到列表中
客户1.添加订单(“汽车”,“3/12/2014”);
customer1.AddOrder(“耳机”,“3/12/2022”);//由于未来时间的原因,将不会添加到列表中
客户2.添加订单(“耳机”,“10/3/2002”);
customer2.AddOrder(“,”);//由于值为空,将不会添加到列表中
//印刷客户
foreach(客户中的var客户)
{
customer.Print();
}
}
}
公共类客户
{
公共字符串名称{get;}
私有列表顺序=新列表();
私有列表ordersHistory=新列表();
公共客户(字符串名称)
{
名称=名称;
}
public void AddOrder(字符串名称、字符串日期)
{
如果(name==null){return;}
else如果(name==“”| | date==“”){return;}
其他的
{
AddHistoricalRecorder(名称、日期);
AddRegularOrder(名称、日期);
}
}
公开作废印刷品()
{
Console.WriteLine(名称);
控制台。写入(“命令:”);
orders.ForEach(Console.Write);
Console.WriteLine();
控制台。写入(“历史订单:”);
ordersHistory.ForEach(Console.Write);
Console.WriteLine();
WriteLine($“订单计数:{orders.Count}”);
Console.WriteLine();
Console.WriteLine();
}
私有void AddRegularOrder(字符串名称、字符串日期)
{
if(DateTime.Parse(date)>DateTime.Now){return;}
其他的
{
for(int i=0;i
即使我搜索并观看了各种封装和接口的视频,我仍然不确定应该如何在这里实现它们。
你能帮我提高代码的效率吗
我没有实现用于公开历史订单的属性(我只是不确定这应该做什么)
此外,我还没有真正理解课程“New is Glue”的一部分,该部分说我们应该避免在代码中添加新关键字,并展示了一些使用接口的示例。我找不到给定范围之外的任何信息
我该如何避免在这个特定项目中创建新实例?
提前谢谢 没有完美的方法来完成某件事,总会有更好的方法来完成,所以不要担心有完美的代码,尤其是当你刚开始的时候 我已经阅读了教程,并且检查了你的代码,我认为到目前为止你做得很好 关于揭露历史秩序的属性,我相信这可以用不同的方式来解释,因为它太笼统了。例如,我可以制作另一个列表,添加客户请求的每个订单,而不必担心日期、名称或是否为空 另一种方法是添加另一个列表作为主列表,例外情况是,如果添加具有相同名称的订单,它将存储该订单,而不会删除前一个,因为它是历史记录 你可以这样做
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}";
}
}
公共类客户
{
公共字符串名称{get;}
私有列表顺序=新列表();
公共列表历史记录程序=新列表();
公共客户(字符串名称)
{
名称=名称;
}
public void AddOrder(字符串名称、字符串日期)
{
如果(姓名=“”| |日期=“”);
else if(DateTime.Parse(date)>DateTime.Now);
其他的
{
for(int i=0;ipublic 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}";
}
}
public void AddOrder(Order o){
if (o == null){
return;
}
//rest of your implememntaton
}