Копирование объектов и интерфейс icioneable
Пример программы
Проиллюстрируем изложенный материал программой CopyDemo. Эта программа делает копию экземпляра класса Course (Курс). В классе Course (Курс) содержится название курса и список (коллекция) студентов.
//Course.h _gc class Course: public Idoneable // класс сборщика мусора Курс: Idoneable { public: String *pTitle; ArrayList *pRoster; Course(String *pTitle) // Курс { this › pTitle = pTitle; pRoster = new ArrayList; } void AddStudent(String *pName) { pRoster › Add(pName); // Добавить } void Show(String *pCaption) // Показать { Console::WriteLine("– {0}– ", pCaption); Console::WriteLine( "Course: {0} with {1} students", // Курс: студенты pTitle, _box(pRoster › Count)); // Счет lEnumerator *pEnum = pRoster › GetEnumerator(); while (pEnum › MoveNext()) { String *pName = dynamic_cast<String *>(pEnum › Current); Console::WriteLine(pName); } } Course *ShallowCopy() // Курс – поверхностная копия { return dynamic_cast<Course *>(MemberwiseClone()); } Object *Clone() { Course *pCourse = new Course(pTitle); // новый Курс pCourse › pRoster = dynamic_cast<ArrayList *>(pRoster › Clone()); // Клон return pCourse; } };
Тестовая программа создает экземпляр класса Course (Курс), называющийся pC1, a затем разными способами создает его копии с именем рС2.
//CopyDemo.h _gc class CopyDemo // класс сборщика мусора CopyDemo { private: // частный static Course *pCl, *pC2; // статический Курс public: static void Main() { Console::WriteLine("Copy is done via pC2 = pCl"); // Копия, сделанная через рС2 = pCl InitializeCourse (); pCl › Show("original"); // Показать ("оригинал"); pC2 = pCl; pC2 › Show("copy"); // Показать ("копия"); pC2 › pTitle = ".NET Programming"; // Программирование на .NET pC2 › AddStudent("Charlie"); // Чарли pC2 › Show("copy with changed title and new student"); // Показать ("копия с измененным названием //и новым студентом"); pCl › Show("original"); // Показать ("оригинал"); Console::WriteLine( "\nCopy is done via pC2 = pCl › ShallowCopy()"); InitializeCourse (); pC2 = pCl › ShallowCopy(); pC2 › pTitle = ".NET Programming"; // Программирование на .NET pC2 › AddStudent("Charlie"); // Чарли pC2 › Show("copy with changed title and new student"}; // Показать ("копия с измененным названием и новым // студентом"); pCl › Show("original"); // Показать ("оригинал"); Console::WriteLine( "\nCopy is done via pC2 = pCl › Clone()"); InitializeCourse (); pC2 = dynamic_oast<Course *>(pCl › Clone()); pC2 › pTitle = ".NET Programming"; // Программирование //на .NET pC2 › AddStudent("Charlie"); // Чарли pC2 › Show("copy with changed title and new student"); // Показать ("копия с измененным названием // новым студентом"); pCl › Show("original"); // Показать ("оригинал"); } private: // частный static void InitializeCourse() { pCl = new Course("Intro to Managed C++"); // новый Курс ("Введение в Управляемый С ++ "); pCl › AddStudent("John"); // Джон pCl › AddStudent("Mary"); // Мэри } };