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

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

Жанры

Интернет-журнал "Домашняя лаборатория", 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);}

}

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

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

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Развод, который ты запомнишь

Рид Тала
1. Развод
Любовные романы:
остросюжетные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод, который ты запомнишь

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Измена. Тайный наследник

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

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Любимая учительница

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

Боги, пиво и дурак. Том 3

Горина Юлия Николаевна
3. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 3

Самый богатый человек в Вавилоне

Клейсон Джордж
Документальная литература:
публицистика
9.29
рейтинг книги
Самый богатый человек в Вавилоне

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва