zoukankan      html  css  js  c++  java
  • 浅谈对象的深度拷贝 IClonable接口

    经常我们会发现,当我们把一个对象列表赋值给另一个对象列表之后,一个改变了,另一个

    也跟着改变了,但是这往往不是我们想看到的

    那么,怎么办呢?

    办法只有一个,那就是让你的对象实现IClonable接口

    对象代码:

    public class Employee : ICloneable
        {
            public int EmployeeID { getset; }
            public string LastName { getset; }
            public string FirstName { getset; }
            public string Title { getset; }
            public string City { getset; }
            public string Region { getset; }
            public string Country { getset; }
            public string Notes { getset; }

            public override string ToString()
            {
                string format = "Employee ID: {0}\nFirst Name: {1}\n"
                              + "Last Name: {2}\nTitle: {3}\nCity: {4}\n"
                              + "Region: {5}\nCountry: {6}\nNotes: {7}\n";

                return string.Format(format, EmployeeID, FirstName, LastName, Title, City, Region, Country, Notes);
            }

            
            public Object Clone()
            {  
                Employee cloned = new Employee();

                cloned.EmployeeID = this.EmployeeID;
                cloned.LastName = this.LastName;
                cloned.FirstName = this.FirstName;
                cloned.Title = this.Title;
                cloned.City = this.City;
                cloned.Region = this.Region;
                cloned.Country = this.Country;
                cloned.Notes = this.Notes;

                return cloned;  
            }
        }

    测试代码如下:

    public void Run()
            {
                EmployeesClient employeeClient = new EmployeesClient();
                List<Employee> srcEmployeeList = employeeClient.GetAllEmployees();

                Console.WriteLine("Source Employee List:");
                Console.WriteLine("--------------------------------------------------------------------");
                Display(srcEmployeeList);
                Console.WriteLine("--------------------------------------------------------------------");

                Console.WriteLine();
                Console.WriteLine();

                List<Employee> dstEmployeeList = new List<Employee>();
                srcEmployeeList.ForEach(emp => dstEmployeeList.Add((Employee)emp.Clone()));
                
                srcEmployeeList[0].LastName = "Huang";
                srcEmployeeList[0].FirstName = "Lynn";

                Console.WriteLine("Source Employee List After Change:");
                Console.WriteLine("--------------------------------------------------------------------");
                Display(srcEmployeeList);
                Console.WriteLine("--------------------------------------------------------------------");

                Console.WriteLine();
                Console.WriteLine();

                Console.WriteLine("Dest Employee List:");
                Console.WriteLine("--------------------------------------------------------------------");
                Display(dstEmployeeList);
                Console.WriteLine("--------------------------------------------------------------------");
            }

            private void Display(IList<Employee> employeeList)
            {
                foreach (Employee employee in employeeList)
                {
                    Console.WriteLine(employee);
                }
            }

    运行结果:

    Source Employee List After Change:
    --------------------------------------------------------------------
    Employee ID: 1
    First Name: Lynn
    Last Name: Huang

    ......

    Dest Employee List:
    --------------------------------------------------------------------
    Employee ID: 1
    First Name: Nancy
    Last Name: Davolio

    ......

    技术改变世界
  • 相关阅读:
    Eclipse报错:pom.xml web.xml is missing and <fainOnMissingWebXml> is set to true
    WebStrom之React Native之HelloWord 【Windows】
    React Native报错:This error often happens when you’re running the packager (local dev server) from a wrong folder
    'adb' 不是内部或外部命令,也不是可运行的程序 或批处理文件。【Windows】
    Spring Boot项目部署到tomcat启动失败404
    Codeforces Beta Round #51 D. Beautiful numbers 数位DP
    UOJ 34 FFT
    POJ 2773 容斥原理
    HTPJ 1268 GCD
    HDOJ 2082 生成函数
  • 原文地址:https://www.cnblogs.com/davidgu/p/2528836.html
Copyright © 2011-2022 走看看