Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 封装和接口_C#_Interface_Encapsulation - Fatal编程技术网

C# 封装和接口

C# 封装和接口,c#,interface,encapsulation,C#,Interface,Encapsulation,几天来,我一直在微软网站上的.NET教程中研究这节课。 正如你可能已经知道的,每节课的最后都有一个“家庭作业”。 这次我应该用一些新特性升级给定的项目,并实现封装和接口 新功能应包括: 客户有一个公开其历史订单的属性 //更新:已实施 客户公开了添加订单的方法 尝试添加空订单不应执行任何操作 尝试添加具有现有订单号的订单应替换现有订单(而不是添加重复订单) //我成功的唯一一件事是删除了以前同名的“订单”,而不是仅仅替换它。 订单应公开OrderDate(可以读/写) 尝试在将来添加带有Or

几天来,我一直在微软网站上的.NET教程中研究这节课。

正如你可能已经知道的,每节课的最后都有一个“家庭作业”。 这次我应该用一些新特性升级给定的项目,并实现封装和接口

新功能应包括:

  • 客户有一个公开其历史订单的属性

    //更新:已实施

  • 客户公开了添加订单的方法

  • 尝试添加空订单不应执行任何操作

  • 尝试添加具有现有订单号的订单应替换现有订单(而不是添加重复订单)

    //我成功的唯一一件事是删除了以前同名的“订单”,而不是仅仅替换它。

  • 订单应公开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
}