Страница 369 из 502
<b>public static Tuple<Tl, T2, T3></b>
<b>Create<Tl, Т2, Т3> (Tl iteml, Т2 item2, ТЗ item3)</b>
Следует заметить, что данный метод возвращает объект типа Tuple<Tl, Т2, Т3>, в котором инкапсулируются члены кортежа iteml, item2 и item3. Вообще говоря, кортежи оказываются полезными в том случае, если группу значений нужно интерпретировать как единое целое. В частности, кортежи можно передавать методам, возвращать из методов или же сохранять в коллекции либо в массиве.
Интерфейсы IComparable и IComparable<T>
Во многих классах приходится реализовывать интерфейс IComparable или IComparable<T>, поскольку он позволяет сравнивать один объект с другим, используя различные методы, определенные в среде .NET Framework. Интерфейсы IComparable и IComparable<T> были представлены в главе 18, где они использовались в примерах программ для сравнения двух объектов, определяемых параметрами обобщенного типа. Кроме того, они упоминались при рассмотрении класса Array ранее в этой главе. Но поскольку эти интерфейсы имеют особое значение и применяются во многих случаях, то ниже приводится их краткое описание.
Интерфейс IComparable реализуется чрезвычайно просто, потому что он состоит всего лишь из одного метода.
<b>int CompareTo(object obj)</b>
В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром obj. Если значение вызывающего объекта больше, чем у объекта obj, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта obj, — отрицательное значение.
Обобщенный вариант интерфейса IComparable объявляется следующим образом.
<b>public interface IComparable<T></b>
В данном варианте тип сравниваемых данных передается параметру Т в качестве аргумента типа. В силу этого объявление метода CompareTo() претерпевает изменения и выглядит так, как показано ниже.
<b>int CompareTo(Т other)</b>
В этом объявлении тип данных, которыми оперирует метод CompareTo(), может быть указан явным образом. Следовательно, интерфейс IComparable<T> обеспечивает типовую безопасность. Именно по этой причине он теперь считается более предпочтительным в программировании на С#, чем интерфейс IComparable.
Интерфейс IEquatable<T>
Интерфейс IEquatable<T> реализуется в тех классах, где требуется определить порядок сравнения двух объектов на равенство их значений. В этом интерфейсе определен только один метод, Equals(), объявление которого приведено ниже.
<b>bool Equals(Т other)</b>
Этот метод возвращает логическое значение true, если значение вызывающего объекта оказывается равным значению другого объекта other, в противном случае — логическое значение false.
Интерфейс IEquatable<T> реализуется в нескольких классах и структурах среды .NET Framework, включая структуры числовых типов и класс String. Для реализации интерфейса IEquatable<T> обычно требуется также переопределять методы Equals(Object) и GetHashCode(), определенные в классе Object.
Интерфейс IConvertible
Интерфейс IConvertible реализуется в структурах всех типов значений, String и DateTime. В нем определяются различные преобразования типов. Реализовывать этот интерфейс в создаваемых пользователем классах, как правило, не требуется.
Интерфейс ICloneable
Реализовав интерфейс ICloneable, можно создать все условия для копирования объекта. В интерфейсе ICloneable определен только один метод, Clone(), объявление которого приведено ниже.
<b>object Clone()</b>
В этом методе создается копия вызывающего объекта, а конкретная его реализация зависит от способа создания копии объекта. Вообще говоря, существуют две разновидности копий объектов: полная и неполная. Если создается полная копия, то копия совершенно не зависит от оригинала. Так, если в исходном объекте содержится ссылка на другой объект О, то при его копировании создается также копия объекта О. А при создании неполной копии осуществляется копирование одних только членов, но не объектов, на которые эти члены ссылаются. Так, после создания неполной копии объекта, ссылающегося на другой объект О, копия и оригинал будут ссылаться на один и тот же объект О, причем любые изменения в объекте О будут оказывать влияние как на копию, так и на оригинал. Как правило, метод Clone() реализуется для получения полной копии. А неполные копии могут быть созданы с помощью метода MemberwiseClone(), определенного в классе Object.
Ниже приведен пример программы, в которой демонстрируется применение интерфейса ICloneable. В ней создается класс Test, содержащий ссылку на объект класса X. В самом классе Test используется метод Clone() для создания полной копии.
<b>// Продемонстрировать применение интерфейса ICloneable.</b>
<b>using System;</b>
<b>class X {</b>
<b> public int a;</b>
<b> public X(int x) { a = x; }</b>
<b>}</b>