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

на главную

Жанры

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

Теперь, когда задача ясна, приступим к ее реализации. Класс Person уже появлялся в наших примерах, поэтому он просто дополнен до нужной функциональности. Добавим методы сравнения двух объектов Person;

//методы сравнения

private static int CompareName(Person obj1, Person obj2)

{

return(string.Compare(obj1.name,obj 2.name));

}

private static int Compareld(Person obj1, Person obj2)

{

if(obj1.id > obj2.id) return(1);

else return(-1);

}

private static int CompareSalary(Person obj1, Person obj2)

{

if(obj1.salary > obj2.salary) return(1);

else if(obj1.salary < obj2.salary)return(-1);

else return(0);

}

private static int CompareSalaryName(Person obj1, Person obj2)

{

if(obj1.salary > obj2.salary) return(1);

else if(obj1.salary < obj2.salary)return (-1);

else return(string.Compare(obj1.name,obj2.name));

}

Заметьте,

методы закрыты и, следовательно, недоступны извне. Их четыре, но могло бы быть и больше, при возрастании сложности объекта растет число таких методов. Все методы имеют одну и ту же сигнатуру и удовлетворяют контракту, заданному делегатом, который будет описан чуть позже. Для каждого метода необходимо построить экземпляр делегата, который будет задавать ссылку на метод. Поскольку не все экземпляры нужны одновременно, то хотелось бы строить их динамически, в тот момент, когда они понадобятся. Это можно сделать, причем непосредственно в классе Person.

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

//делегаты как свойства

public static Persons.CompareItems SortByName

{

get {return(new Persons.CompareItems(CompareName));}

}

public static Persons.CompareItems SortById

}

get {return(new Persons.CompareItems(CompareId));

}

public static Persons.CompareItems SortBySalary

{

get {return(new Persons.CompareItems(CompareSalary));}

}

public static Persons.CompareItems SortBySalaryName

{

get {return(new Persons.CompareItems(CompareSalaryName));}

}

Всякий раз, когда будет запрошено, например, свойство SortByName класса Person, будет возвращен объект функционального класса Persons. CompareItems, задающий ссылку на метод CompareName класса Person. Объект будет создаваться динамически в момент запроса.

Класс Person полностью определен, и теперь давайте перейдем к определению контейнера, содержащего объекты Person. Начну с определения свойств класса Persons:

class Persons

{ //контейнер объектов Person

//делегат

public delegate int CompareItems(Person obj1, Person obj2);

private int freeItem = 0;

const int n = 100;

private Person[]persons = new Person[n];

}

В

классе определен функциональный класс — делегат CompareItems, задающий контракт, которому должны удовлетворять функции сравнения элементов.

Контейнер объектов реализован простейшим образом в виде массива объектов. Переменная freeItem — указатель на первый свободный элемент массива. Сам массив является закрытым свойством, и доступ к нему осуществляется благодаря индексатору:

//индексатор

public Person this[int num]

{

get { return(persons[num-1]); }

set { persons[num-1] = value; }

}

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

public void AddPerson(Person pers)

{

if (freeItem < n)

{

Person p = new Person(pers);

persons[freeItem++]= p;

}

else Console.WriteLine("He могу добавить Person");

}

public void LoadPersons

{

//реально загрузка должна идти из базы данных

AddPerson(new Person("Соколов",123, 750.0));

AddPerson(new Person("Синицын",128, 850.0));

AddPerson(new Person("Воробьев",223, 750.0));

AddPerson(new Person("Орлов",129, 800.0));

AddPerson(new Person("Соколов", 133, 1750.0));

AddPerson(new Person("Орлов",119, 750.0));

}//LoadPersons

public void PrintPersons

{

for (int i =0; i<freeItem; i + +)

{

Console.WriteLine("{0,10} {1,5} {2,5}",

persons[i].Name, persons[i].Id, persons[i].Salary);

}

}//PrintPersons

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

//сортировка

public void SimpleSortPerson(CompareItems compare)

{

Person temp = new Person;

for(int i = 1; i<freeItem;i++)

for(int j = freeItem -1; j>=i; j-)

if (compare(persons[j],persons[j —1])==-1)

{

temp = persons[j-1];

persons[j — 1]=persons[j];

persons[j] = temp;

}

}//SimpleSortObject

}//Persons

Единственный аргумент метода SimpleSortPerson принадлежит классу CompareItems, заданному делегатом. Что касается метода сортировки, то реализован простейший алгоритм пузырьковой сортировки, со своей задачей он справляется. На этом проектирование классов закончено, нужная цель достигнута, показано, как можно в классе экземпляры делегатов задавать как свойства. Для завершения обсуждения следует продемонстрировать, как этим нужно пользоваться. Зададим, как обычно, тестирующую процедуру, в которой будут использоваться различные критерии сортировки:

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

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Безымянный раб [Другая редакция]

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
боевая фантастика
9.41
рейтинг книги
Безымянный раб [Другая редакция]

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Эксперимент

Юнина Наталья
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Эксперимент

Начальник милиции

Дамиров Рафаэль
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Восход. Солнцев. Книга VII

Скабер Артемий
7. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VII

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

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

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Тринадцатый