Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 91

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 85 86 87 88 89 90 < 91 > 92 93 94 95 96 97 .. 320 >> Следующая

// в классе Point псзгеекіу- глубокого чипироиания
// через интерфейс ICIoneable public class Point : ICIoneable {
Il Данные о состоянии объекта public int x. у;
// Конструктов public PointC) {)
public Point(int x, int y){this.x - x: this.у = у:)
//Реализуем единственный нетод ICIoneable public object CloneO {
¦ return new Point(this.x, this.y)
}
public override string ToStringO {return "X: " + X + " Y: " + y: }
}
Теперь мы можем создавать полностью независимые от исходного объекта копии объекта Poi nt. Выглядеть это может, к примеру, так:
// Обратите внимание, что CloneO возвращает "объект вообще". Чтобы получить из него // нужный нам производный тип, придется провести явное преобразование типов ,Point рЗ = new Po int (100, 100); Point р4 = (POint)p3.CloneO;
//Меняем р4.х (при этом рЗ.х не изменится} р4.х = 0;
Il Проверяем, так ли это:
Console. WriteLine ("Deep copying using CloneO"); Console.WriteLiпе(рЗ); Console.WriteLine(p4);
Если этот код покажется вам слегка знакомым, так оно и должно быть. Когда в главе 2 мы разбирали особенности работы с ссылочными и структурными типами, мы выяснили, что для структурных типов (например, структур С# или nt) всегда используется глубокое (побитовое) копирование. Однако если мы хотим обеспечить возможность использовать глубокое копирование для объекта ссылочного типа (класса), то лучше всего сделать это, реализовав интерфейс ICIoneable.
214 Глава 4 • Интерфейсы и коллекции
Однако будем внимательны! Если наш класс является производным от одного из многочисленных стандартных встроенных кллстон-^іолуфаоршагпчї» из библиотеки базовых классов С#, то вполне возможно, что этот интерфейс в нем уже реализован. Мы советуем перед тем, как приступать к собственной реализации ICl oneable, выяснить этот вопрос, обратившись к электронной документации Visual Studio.NET.
Код приложения ObjClone можно найти в подкаталоге Chapter 4.
Создание сравниваемых объектов (интерфейс !Comparable)
Еще один распространенный интерфейс Котра га Ы е, также определенный в пространстве имен 5 t em, позволяет производить сортировку объектов, основываясь на специально определенном внутреннем ключе. Формальное определение этого интерфейса выглядит следующим образом:
// Этот интерфейс позволяет определять место объекта среди Других аналогичных // объектов interface IComparable {
int CompareTofobject о):
}
Давайте предположим, что наш класс Саг уже снова изменен таким образом, чтобы поддерживать и прозвище (pet N Ш), и внутренний идентификатор С ir D). Пусть пользователь создал массив объектов С,-:iг следующим образом:
// Создаеи нассив объектов Саг Саг[] myAutos - new Car[5]: myAutosCO] - newCar(123. "Rusty"): myAutosfl] = newCar(6. "Mary"); myAutos[2] = newCar(83. "Viper"); myAutos[3] - new Car(13. "NaName"): myAutos[4] = new Car{9873, "Сгшску");
Как уже говорилось, в классе System. Array определен статический метод о t С помощью этого метода можно упорядочить (по возрастанию) массив из элементов некоторых встроенных типов данных (например, таких как It и s t). Однако что произойдет, если вызвать этот метод для массива объектов С. г г?
// Попробует рассортировать автомобили? Array.Sort(myAutos): // Что-то не выходит...
Если попробовать запустить этот код на выполнение, будет сгенерировано исключение ArgumentExcepti on со следующим комментарием: At least one object must imp! ement I Comparabl e («По крайней мере в одном объектедолжен быть реализован I Compa rabl е»). Таким образом, чтобы можно было стандартным способом производить сортировку ваших пользовательских объектов, они должны реализовывать интерфейс I Compa га b 1 е. Поскольку этот интерфейс состоит из единственного мето-даСотрагеТо( ),всясользаключаетсявтом, как будет реализован этот метод. Видимо, наиболее важное решение, которое мы должны принять, — это определить, по
значению какой внутренней переменной будет производиться сортировка. Для
Создание сравниваемых объектов (интерфейс 215
нашего типа Саг самая подходящая переменная - это идентификатор автомобиля
СагЮ:
// Такая реализация кэюде СозрагеТоО позвонит сортировать объекты «ьто«о5»,тей
// по знамение идентификатора - CarJD
public class Саг : Komparable
і
\
II Реализация IComparable
int IComparable.CompareToiobject o)
{
Car temp = Car(o): if(th1s.CarID > temp.CarlD)
return 1: iftthis.CarlD < temp.CarJD)
return -1;
else
return 0;
Как видно из этого все, что делает метод СотрагеТоО, состоит в том, что он сравнивает значение Car ID для текущего объекта (того, для которого вызван этот метод) со значением CarlD для принимаемого объекта (того объекта, который передан этому методу в качестве входящего параметра). В зависимости от результатов сравнения выдается одно из трех возможных значений. Что каждое из этих значений может значить для тех, кто пользуется методом СотрагеТоО, показано в табл. 4.1.
Таблица 4.1. Значения, возвращаемые методом СотрагеТоО
Значение Что оно значит
Любое число меньше нуля Значение идентификатора у текущего объекта меньше, чем у принимаемого в качестве параметра
Предыдущая << 1 .. 85 86 87 88 89 90 < 91 > 92 93 94 95 96 97 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100