Шрифт:
На рис. 7.8 показан соответствующий вывод.
Рис. 7.8. Метод MemberwiseClone возвращает поверхностную копию объекта
Для того чтобы метод Clone возвращал полные копии внутренних ссылочных типов, нужно "научить" возвращаемый методом MemberwiseClone объект учитывать текущее имя объекта Point (тип System.Guid является структурой, так что на самом деле копируются числовые данные). Вот одна из возможных реализаций.
Если выполнить приложение теперь, то вы увидите (рис. 7.9), что возвращенный методом Clone объект Point действительно копирует внутренние ссылочные члены-переменные типа (обратите внимание на то, что здесь p3 и p4 имеют свои уникальные имена).
Итак, в том случае, когда класс или структура содержит только типы, характеризуемые значениями, лучше реализовать метод Clone, использующий MemberwiseClone. Однако в том случае, когда пользовательский тип содержит ссылочные типы, вы должны создать новый тип, принимающий во внимание все члены-переменные ссылочного типа.
Рис. 7.9. Здесь получена полная копия объекта
Исходный код. Проект CloneablePoint размещен в подкаталоге, соответствующем главе 7.
Создание сравнимых объектов (IComparable)
Интерфейс System.IComparable определяет поведение, позволяющее сортировать объекты по заданному ключу. Вот формальное определение.
Предположим теперь, что класс Car поддерживает некоторый внутренний идентификатор (представленный целым числом, хранимым в переменной carID), значение которого можно устанавливать с помощью параметра конструктора и изменять с помощью нового свойства ID. Ниже показана соответствующая модификация типа Car.
Пользователи объекта могут создать массив типов Car так.