Копирование объектов и интерфейс icioneable
Почленное копирование
Теперь проиллюстрируем почленное копирование, выполненное с помощью метода MemberwiseClone класса Object (Объект). Так как этот метод защищен (имеет спецификатор доступа protected), он может быть вызван непосредственно только из экземпляра класса Course (Курс). Поэтому в классе Course (Курс) мы определили метод ShallowCopy, реализованный через метод MemberwiseClone.
_gc class Course: public ICloneable // класс сборщика мусора Курс: ICloneable { Course *ShallowCopy() { return dynamic_cast<Course *>(MemberwiseClone()); } };
Приведем вторую часть тестовой программы, в которой происходит вызов метода ShallowCopy. Так же, как и раньше, изменим с помощью второго указателя заголовок и добавим в список нового студента.
_gc class CopyDemo // класс сборщика мусора CopyDemo { public: static void Main() { 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"); // Показать ("оригинал");
Ниже приведен результат работы второй части программы. Видно, что поле Title (Название), существует после копирования в двух независимых экземплярах, но коллекция Roster (Список), представляющая собой список студентов, была скопирована через указатель. Поэтому она одна для обеих копий, и изменения, внесенные с использованием одного указателя, видны через другой.
Copy is done via pC2 = pCl › ShallowCopy() – -copy with changed title and new student– -– Course: .NET Programming with 3 students John Mary Charlie – ---original----- Course: Intro to Managed C++ with 3 students John Mary Charlie
А вот и перевод выдачи:
Копия сделана через рС2 = рС1 › ShallowCopy () – ---копия с измененным названием и новым студентом----- – Курс: Программирование на.МЕТ с 3 студентами Джон Мэри Чарли – --оригинал----- Курс: Введение в Управляемый С ++ с 3 студентами Джон Мэри Чарли