Герберт Шилдт - C# 4.0 полное руководство - 2011 Страница 144

Тут можно читать бесплатно Герберт Шилдт - C# 4.0 полное руководство - 2011. Жанр: Разная литература / Прочее, год неизвестен. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте 500book.ru или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Герберт Шилдт - C# 4.0 полное руководство - 2011
  • Категория: Разная литература / Прочее
  • Автор: Герберт Шилдт
  • Год выпуска: неизвестен
  • ISBN: нет данных
  • Издательство: неизвестно
  • Страниц: 268
  • Добавлено: 2019-06-19 17:21:32
  • Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту pbn.book@yandex.ru для удаления материала


Герберт Шилдт - C# 4.0 полное руководство - 2011 краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «Герберт Шилдт - C# 4.0 полное руководство - 2011» бесплатно полную версию:

Герберт Шилдт - C# 4.0 полное руководство - 2011 читать онлайн бесплатно

Герберт Шилдт - C# 4.0 полное руководство - 2011 - читать книгу онлайн бесплатно, автор Герберт Шилдт

}

Обратите внимание в приведенном выше примере на применение следующега ограничения.

where Т : IEquatable<T>

Это ограничение гарантирует, что только те типы, в которых реализован интерфейс IEquatable, являются действительными аргументами типа для метода Is In (). Внутри этого метода применяется метод Equals (), который определяет равенство одного объекта другому.

Для определения относительного порядка следования двух элементов применяется интерфейс I Comp а г able. У этого интерфейса имеются две формы: обобщенная и необобщенная. Обобщенная форма данного интерфейса обладает преимуществом обеспечения типовой безопасности, и поэтому мы рассмотрим здесь именно ее. Обобщенный интерфейс IComparable<T> объявляется следующим образом.

public interface IComparable<T>

Сравниваемый тип данных передается ему в качестве аргумента типа Т. В этом интерфейсе определяется метод CompareTo (), как показано ниже.

int CompareTo(Т other)

В этом методе сравниваются вызывающий объект и другой объект, определяемый параметром other. В итоге возвращается нуль, если вызывающий объект оказывается больше, чем объект other; и отрицательное значение, если вызывающий объект оказывается меньше, чем объект other.

Для того чтобы воспользоваться методом CompareTo (), необходимо указать ограничение, которое требуется наложить на аргумент типа для реализации обобщенного интерфейса IComparable<T>. А затем достаточно вызвать метод CompareTo (), чтобы сравнить два экземпляра параметра типа.

Ниже приведен пример применения обобщенного интерфейса IComparable<T>. В этом примере вызывается метод InRange (), возвращающий логическое значение true, если объект оказывается среди элементов отсортированного массива.

// Требуется обобщенный интерфейс IComparable<T>. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs.

public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 ||

what.CompareTo(obs[obs.Length-1]) > 0) return false; return true;

}

В приведенном ниже примере программы демонстрируется применение обоих методов Is In () и InRange () на практике.

// Продемонстрировать применение обобщенных // интерфейсов IComparable<T> и IEquatable<T>.

using System;

// Теперь в классе MyClass реализуются обобщенные // интерфейсы IComparable<T> и IEquatable<T>. class MyClass : IComparable<MyClass>, IEquatable<MyClass> { public int Val;

public MyClass(int x) { Val = x; }

// Реализовать обобщенный интерфейс IComparable<T>. public int CompareTo(MyClass other) {

return Val - other.Val; // Now, no cast is needed.

> \

// Реализовать обобщенный интерфейс IEquatable<T>.

public bool Equals(MyClass other) { return Val == other.Val;

}

// Переопределить метод Equals(Object).

public override bool Equals(Object obj) { if(obj is MyClass)

return Equals((MyClass) obj); return false;

}

// Переопределить метод GetHashCode().

public override int GetHashCode() { return Val.GetHashCode() ;

}

}

class CompareDemo {

// Требуется обобщенный интерфейс IEquatable<T>.

public static bool IsIn<T>(T what, T[] obs) where T : IEquatable<T> { foreach(T v in obs)

if(v.Equals(what)) // Применяется метод Equals() return true;

return false;

}

// Требуется обобщенный интерфейс IComparable<T>. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs.

public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 ||

what.CompareTo(ob§[obs.Length-1]) > 0) return false; return true;

}

// Продемонстрировать операции сравнения, static void Main() {

// Применить метод Isln() к данным типа int. int[] nums = { 1, 2, 3, 4, 5 };

if(IsIn(2, nums))

Console.WriteLine("Найдено значение 2.");

if(Isln(99, nums))

Console.WriteLine("He подлежит выводу.");

// Применить метод Isln() к объектам класса MyClass.

MyClass[] mcs = { new MyClass(1), new MyClass(2),

new MyClass(3), new MyClass(4) };

if(lsln(new MyClass(3), mcs))

Console.WriteLine("Найден объект MyClass(3).");

if(Isln(new MyClass(99), mcs))

Console.WriteLine("He подлежит выводу.");

// Применить метод InRange() к данным типа int. if(InRange(2, nums))

Console.WriteLine("Значение 2 находится в границах массива nums."); if(InRange(1, nums))

Console.WriteLine("Значение 1 находится в границах массива nums."); if(InRange(5, nums))

Console.WriteLine("Значение 5 находится в границах массива nums."); if(!InRange(0, nums))

Console.WriteLine("Значение О HE находится в границах массива nums."); if(!InRange(6, nums))

Console.WriteLine("Значение 6 HE находится в границах массива nums.");

// Применить метод InRange() к объектам класса MyClass.. if(InRange(new MyClass(2), mcs))

Console.WriteLine("Объект MyClass(2) находится в границах массива nums."); if(InRange(new MyClass(1), mcs))

Console.WriteLine("Объект MyClass(1) находится " +

"в границах массива nums."); if(InRange(new MyClass(4), mcs))

Console.WriteLine("Объект MyClass(4) находится " +

"в границах массива nums."); if(!InRange(new MyClass(0), mcs))

Console.WriteLine("Объект MyClass(0) HE " +

"находится в границах массива nums."); if(!InRange(new MyClass(5), mcs))

Console.WriteLine("Объект MyClass(5) HE " +

"находится в границах массива nums.");

}

}

Выполнение этой программы приводит к следующему результату.

Найдено значение 2.

Найден объект MyClass (3) .

Значение 2 находится в границах массива nums.

Значение 1 находится в границах массива nums.

Значение 5 находится в границах массива nums.

Значение 0 НЕ находится в границах массива nums

Значение 6 НЕ находится в границах массива nums

Объект MyClass(2)    находится    в    границах    массива    nums.

Объект MyClass(1)    находится    в    границах    массива    nums.

Объект MyClass(4)    находится    в    границах    массива    nums.

Объект MyClass(0) НЕ находится в границах массива nums.

Объект MyClass(5) НЕ находится в границах массива nums.

ПРИМЕЧАНИЕ

Если параметр типа обозначает ссылку или ограничение на базовый класс, то к экземплярам объектов, определяемых таким параметром типа, можно применять операторы == и ! =, хотя они проверяют на равенство только ссылки. А для сравнения значений придется реализовать интерфейс IComparable или же обобщенные интерфейсы IComparable<T> и IEquatable<T>.

Иерархии обобщенных классов

Обобщенные классы могут входить в иерархию классов аналогично необобщенным классам. Следовательно, обобщенный класс может действовать как базовый или производный класс. Главное отличие между иерархиями обобщенных и необобщенных классов заключается в том, что в первом случае аргументы типа, необходимые обобщенному базовому классу, должны передаваться всеми производными классами вверх по иерархии аналогично передаче аргументов конструктора.

Применение обобщенного базового класса

Ниже приведен простой пример иерархии, в которой используется обобщенный базовый класс.

// Простая иерархия обобщенных классов, using System;

// Обобщенный базовый класс, class Gen<T> {

Т ob;

public Gen(Т о) { ob = о;

}

// Возвратить значение переменной ob. public Т GetOb() { return ob;

}

}

// Класс, производный от класса Gen. class Gen2<T> : Gen<T> {

public Gen2(T o) : base(o) {

II ...

}

1

class GenHierDemo { static void Main() {

Gen2<string> g2 = new Gen2<string>("Привет") ;

Console.WriteLine(g2.GetOb());

В этой иерархии класс Gen2 наследует от обобщенного класса Gen. Обратите внимание на объявление класса Gen2 в следующей строке кода.

class Gen2<T> : Gen<T> {

Параметр типа Т указывается в объявлении класса Gen2 и в то же время передается классу Gen. Это означает, что любой тип, передаваемый классу Gen2, будет передаваться также классу Gen. Например, в следующем объявлении:

Gen2<string> g2 = new Gen2<string>("Привет");

параметр типа string передается классу Gen. Поэтому переменная ob в той части класса Gen2, которая относится к классу Gen, будет иметь тип string.

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.