Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

Два метода класса являются запросами, позволяющими извлечь ключ и элемент списка, который отмечен курсором:

public К Key

{

return (cursor.key);

}

public T Item

{

return(cursor.item);

}

Давайте рассмотрим теперь тестирующую процедуру — клиента нашего списка, демонстрирующую работу со списками, в которых элементы и ключи имеют разные типы:

public void TestConstraint

{

OneLinkList<int, string> list1 = new OneLinkList

<int, string>;

list1.add(33, "thirty three"); list1.add (22, "twenty two");

if (list1.findstart(33)) Console.WriteLine ("33 —

найдено!");

else Console.WriteLine("33 — не найдено!");

if (list1.findstart(22)) Console.WriteLine ("22 — найдено!");

else Console.WriteLine("22 — не найдено!");

if (list1.findstart(44)) Console.WriteLine ("44 — найдено!");

else Console.WriteLine("44 — не найдено!");

Person pers1 = new Person("Савлов", 25, 1500);

Person pers2 = new Person("Павлов", 35, 2100);

OneLinkList<string, Person> list2 = new OneLinkList

< string, Person>;

list2.add("Савл", pers1); list2.add("Павел", pers2);

if (list2.findstart("Павел")) Console.WriteLine ("Павел — найдено!");

else Console.WriteLine("Павел — не найдено!");

if (list2.findstart("Савл")) Console.WriteLine ("Савл — найдено!");

else Console.WriteLine("Савл — не найдено!");

if (list2.findstart("Иоанн")) Console.WriteLine ("Иоанн — найдено!");

else Console.WriteLine("Иоанн — не найдено!");

Person pers3 = new Person("Иванов", 33, 3000);

list2.add("Иоанн", pers3); list2.start ;

Person pers = list2.Item; pers.PrintPerson;

list2.findstart("Иоанн"); pers = list2.Item;

pers.PrintPerson;

}

Рис. 22.5. Поиск в списке с ограниченной универсальностью

Обратите внимание на строки, где создаются два списка:

OneLinkList<int, string> list1 = new OneLinkList<int, string>;

OneLinkList<string, Person> list2 = new OneLinkList< string, Person>;

У списка list1 ключи имеют тип int, у списка list2 — string. Заметьте, оба фактических типа, согласно обязательствам, реализуют интерфейс IComparable, у первого списка тип элементов — string, у второго — Person. Все работает прекрасно. Вот результаты вычислений по этой процедуре:

Как справиться с арифметикой

Представьте себе, что мы хотим иметь специализированный вариант нашего списка, элементы которого допускали бы операцию сложения и одно из полей которого сохраняло бы сумму всех элементов, добавленных в список. Как задать соответствующее ограничение на класс?

Как

уже говорилось, наличие ограничения операции, где можно было бы указать, что над элементами определена операция +, решало бы проблему. Но такого типа ограничений нет. Хуже того, нет и интерфейса INumeric, аналогичного IComparable, определяющего метод сложения Add. Так что нам не может помочь и ограничение наследования.

Вот один из возможных выходов, предлагаемых в такой ситуации. Стратегия следующая: определим абстрактный универсальный класс Calc с методами, выполняющими вычисления. Затем создадим конкретизированных потомков этого класса. В классе, задающем список с суммированием, введем поле класса Calc. При создании экземпляров класса будем передавать фактические типы ключа и элементов, а также соответствующий калькулятор, но уже не как тип, а как аргумент конструктора класса. Этот калькулятор, согласованный с типом элементов, и будет выполнять нужные вычисления. Давайте приступим к реализации этой стратегии. Начнем с определения класса Calc;

public abstract class Calc<T>

{

public abstract T Add(T a, T b);

public abstract T Sub(T a, T b);

public abstract T Mult(T a, T b);

public abstract T Div(T a, T b);

}

Наш абстрактный универсальный класс определяет четыре арифметические операции. Давайте построим трех его конкретизированных потомков:

public class IntCalc: Calc<int>

{

public override int Add(int a, int b) { return (a + b);}

public override int Sub (int a, int b) { return (a — b);}

public override int Mult(int a, int b) { return (a * b);}

public override int Div(int a, int b) { return (a / b); }

}

public class DoubleCalc: Calc<double>

{

public override double Add(double a, double b)

{return (a + b);}

public override double Sub(double a, double b)

{return (a — b);}

public override double Mult(double a, double b)

{return (a * b);}

public override double Div(double a, double b)

{return (a / b);}

}

public class StringCalc: Calc<string>

{

public override string Add(string a, string b)

{return (a + b);}

public override string Sub(string a, string b)

{return (a);}

public override string Mult(string a, string b)

{return (a);}

public override string Div (string a, string b)

{return (a);}

}

Здесь определяются три разных калькулятора: один — над целочисленными данными, другой — над данными с плавающей точкой, третий — над строковыми данными. В последнем случае определена, по сути, только операция сложения строк (конкатенации).

Поделиться:
Популярные книги

Адъютант

Демиров Леонид
2. Мания крафта
Фантастика:
фэнтези
6.43
рейтинг книги
Адъютант

Защитник

Астахов Евгений Евгеньевич
7. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Защитник

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального

Назад в СССР: 1985 Книга 2

Гаусс Максим
2. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в СССР: 1985 Книга 2

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Жена на четверых

Кожина Ксения
Любовные романы:
любовно-фантастические романы
эро литература
5.60
рейтинг книги
Жена на четверых

Титан империи

Артемов Александр Александрович
1. Титан Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Титан империи

СД. Восемнадцатый том. Часть 1

Клеванский Кирилл Сергеевич
31. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.93
рейтинг книги
СД. Восемнадцатый том. Часть 1

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11