Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Этап 2. 2 страница




Функция демонстрационной программы: удаление заданного полинома из массива.

6. Описать класс АВТОМАШИНА (поля: МАРКА (задается из фиксированного списка), ГОД ВЫПУСКА, НОМЕР, ФАМИЛИЯ ВЛАДЕЛЬЦА).

Операция класса: вычисление разницы в годах выпуска между двумя машинами (-)

Статический метод класса: сортировка массива машин по фамилии владельца.

Функция демонстрационной программы: поиск в массиве всех машин с заданной маркой.

7. Описать класс СТУДЕНТ (поля ФИО, ЧИСЛО, МЕСЯЦ, ГОД РОЖДЕНИЯ).

Операция класса: вычисление разницы в возрасте (в днях) для двух студентов (-).

Статический метод класса: поиск в массиве всех студентов заданного года рождения.

Функция демонстрационной программы: удаление студента с заданной фамилией из массива.

8. Описать класс ИСТОРИЧЕСКОЕ СОБЫТИЕ (поля ГОД, СОБЫТИЕ, УРОВЕНЬ (международный, всероссийский, местный)). Дополнительные функции демонстрационной программы:

Операция класса: вычисление разницы в годах между двумя событиями (-)

Статический метод класса: сортировка массива событий по комбинации (год, событие);

Функция демонстрационной программы: поиск в массиве событий всех событий заданного уровня.

9. Описать класс СТУДЕНТ (поля: ФИО, ГОД РОЖДЕНИЯ, НОМЕР ГРУППЫ (задается из фиксированного списка)). Дополнительные функции демонстрационной программы:

Операция класса: вычисление разницы в возрасте для двух студентов (-).

Статический метод класса: удаление из массива студента с определенной ФИО;

Функция демонстрационной программы: поиск в массиве всех студентов с заданным номером группы.

10. Описать класс ТОВАР (поля: НАИМЕНОВАНИЕ ТОВАРА, СТРАНА-производитель (задается из фиксированного списка), ОБЪЕМ ПАРТИИ (в штуках)).

Дополнительные Операция класса: увеличение объема партии товара на n%(*)

Статический метод класса: сортировка массива товаров по наименованию;

Функция демонстрационной программы: поиск всех товаров, импортируемых заданной страной.

11. Описать класс УЧЕНИК (поля: ФИО, ГОД ОБУЧЕНИЯ, НАЗВАНИЯ КЛАССА (БУКВА a-д)).

Операция класса: перевод ученика в следующий класс (++)

Статический метод класса: сортировка массива учеников по паре (год обучения, название класса);

Функция демонстрационной программы: удаление ученика с заданной ФИО из массива.

12. Описать класс УЧЕНИК (поля: ФИО, ГОД ОБУЧЕНИЯ, НАЗВАНИЯ КЛАССА (БУКВА a-д)), ИТОГОВАЯ ОЦЕНКА)

Операция класса: увеличение итоговой оценки (++)

Статический метод класса: сортировка массива учеников по фамилии;

Функция демонстрационной программы: поиск всех учеников с отличной итоговой оценкой

 

 


 

Глава 8. Наследование

Наследование – это возможность создания иерархии классов, в которой потомки (производные классы, наследники) получают элементов своих предков (родителей, базовых классов), могут их изменять и добавлять новые.

Класс в C# может иметь произвольное количество потомков и только одного предка. При описании класса имя его предка записывается в заголовке класса после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object:

[ атрибуты ] [ спецификаторы ] class имя_класса [: предки ]

тело класса

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

Например, создадим производный класс CStudentMaster от базового класса CStudent, предназначенный для хранения данных о студенте магиструры.

class CStudentMaster: CStudent

{

string research;

public CStudentMaster()

{

research = "Unknown";

}

public CStudentMaster(string name, string speciality, gender_type gender, int year_tr, string research):base(name, speciality, gender, year_tr)

{

Year=year_tr;

this.research=research;

}

 

public string Research

{

get { return research; }

set

{

if (research == "Unknown")

{

if (value == "") name = "Unknown";

else research = value;

}

}

}

new public int Year

{

get { return year_tr; }

set

{ // способ установки свойства

if (value >= 1 && value <= 2)

{

year_tr = value;

}

else throw new Exception("При изменении курса студента указано недопустимое значение. Значение должно быть интевале [1,2]");

}

}

new public void input()

{

base.input();

Year = year_tr;

Console.WriteLine("Введите тему НИР студента");

Research = Console.ReadLine();

}

new public void output()

{

base.output();

Console.WriteLine("research ={0,10}", research);

 

}

}

Рассмотрим поля и методы производного класса.

Все поля и методы базового класса, кроме конструкторов, наследуются.

Если поля или методы класса – предка имеют тип private, то класс-потомок не имеет к ним прямого доступа и для работы с ними в необходимо использовать открытые методы базового класса.

Если функциям производного класса требуется работать с полями базового, то в базовом классе такие поля можно описать как protected. Поэтому если проектируется иерархия классов, то это более предпочтительный вариант. Таким образом, целесообразно изменить видимость полей в классе CStudent c private на protected.

В производном классе могут быть собственные поля и методы.

Если новые поля и методы имеют уникальные имена, то они описываются как обычные поля и методы класса.

В производном классе можно описать поле с таким же именем, что и в базовом классе, возможно, изменив тип этого поля и его модификаторы. В этом случае поле базового класса будет скрыто (не удалено!). Скрытое родительское поле остается доступно в классе-наследнике через обращение base.имя_поля.

В классе CStudentMaster добавлено одно поле research и одно свойство Research.

В производном классе можно добавить метод с таким же именем, что и в базовом классе. При этом возможны три варианта.

Переопределяемый метод отличается списком параметров. Вызов нужного метода определяется обычными правилами перегрузки методов.

Переопределение метода с модификаторами virtual, abstract или override. Это наиболее интересная ситуация, и она будет подробно рассмотрена далее. При переопределении сохраняется заголовок и модификаторы доступа наследуемого метода.

Скрытие метода, т.е. его переопределение с таким же заголовком с модификатором new. Здесь ситуация такая же, как и со скрытием полей. При вызове метода по его имени предпочтение будет отдаваться методу потомка. Это не означает, что метод родителя становится недоступным. В переопределенном методе производного класса вызвать метод базового класса можно обратившись к нему с помощью ключевого слова base, например base.output();В классе CStudentMaster переопределены скрытием методы input(), output(), свойство Year;

Таким образом, переопределение методов реализует принцип полиморфизма.

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

Правила наследования конструкторов класса

1. Конструкторы класса не наследуются. Следовательно, производный класс должен иметь собственные конструкторы.

2. Если в производном классе программистом не определен ни один конструктор, то компилятором автоматически создастся конструктор по умолчанию, который вызовет конструктор по умолчанию базового класса и инициализирует все собственные поля значениями по умолчанию.

3. Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, то автоматически вызывается конструктор по умолчанию базового класса

4. В случае необходимости явного вызова конструктора базового класса из конструктора производного класса конструктор производного класса определяют следующим образом
имя_производного_класса (список формальных параметров): base (список фактических параметров) {тело}

5. В случае иерархии классов, конструкторы базовых классов вызываются, начиная с самого верхнего уровня.

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

Console.WriteLine("Для демонстрации методов класса создайте студента магистратуры");

CStudentMaster s = new CStudentMaster();

Console.WriteLine("\nСоздан студент:");

s.output();

Console.WriteLine("\nИзмените данные о студенте:");

s.input();

Console.WriteLine("\nДанные о студенте изменены:");

s.output();

CStudentMaster s1 = new CStudentMaster("Петрова", "Информатика", gender_type.female, 1, "Automata");

Console.WriteLine("\nСоздан новый студент:");

s1.output();

Задание 10. Наследование

Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1-10.

 

1. Описать базовый класс CStr - строка. Обязательные поля класса CStr: поле для хранения символов строки, значение типа byte хранит длину строки в байтах. Обязательные методы должны выполнять следующие действия: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string, конструктор, принимающий в качестве параметра символ; свойства; получение длины строки; очистка строки (сделать строку пустой). Переопределить следующие операции: сложение (+) — конкатенация строк; операция (==) - проверка на равенство. Описать производный от СStr класс CDstr - десятичная строка. Строки данного класса могут содержать только символы десятичных цифр и символы - и +, задающие знак числа. Символы - или + могут находиться только в первой позиции числа, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, десятичная строка принимает нулевое значение. Содержимое данной строки рассматривается как десятичное число. Класс CDStr содержит следующие методы: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string; свойства; метод, преобразующий данную строку в целое число. Переопределить следующие операции: вычитание (-) — арифметическая разность строк; операция >— проверка на больше (по значению); операция < — проверка на меньше (по значению). Написать демонстрационную программу.

2. Описать базовый класс CStr – строка (см. вариант 1). Описать производный от СStr класс CSStr – шестнадцатеричная строка. Строки данного класса могут содержать только шестнадцатиричные символы. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, строка принимает нулевое значение. Содержимое данной строки рассматривается как знаковое шестнадцатеричное число.. Класс CSStr содержит следующие методы: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string; свойства, метод, преобразующий данную строку в целое десятичное число, метод изменение знака на противоположный (перевод числа в дополнительный код). Переопределить следующие операции: сложение (+) — арифметическая сумма строк; операция (==) — проверка на равенство. Написать демонстрационную программу.

3. Описать базовый класс CStr – строка (см. вариант 1). Описать производный от CStr класс CStr_ID – строка - идентификатор. Строки данного класса строятся по правилам записи идентификаторов в языке С и могут включать в себя только те символы, которые могут входить в состав С-идентификаторов. Если исходные данные противоречат правилам записи идентификатора, то создается пустая строка-идентификатор. Класс CStr_ID содержит следующие методы: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string; конструктор, принимающий в качестве параметра символ; свойства. Переопределить операцию больше (>) - проверка на больше. (Строка считается больше другой, если код символа первой строки в i -й позиции, i изменяется от 0 до n -1, где n — длина более короткой строки, больше кода символа в той же позиции во второй строке, длины строк могут не совпадать), операцию меньше (<) - проверка на меньше. Написать демонстрационную программу.

4. Описать базовый класс CStr – строка (см. вариант 1). Описать производный от CStr класс CStr_С – строка – комментарий. Строки данного класса строятся по правилам записи комментариев в С++. Если исходные данные противоречат правилам записи идентификатора, то создается пустая строка-идентификатор. Класс CStr_С содержит следующие методы: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string; свойства; перевод всех символов строки в верхний регистр; перевод всех символов строки в нижний регистр; поиск первого вхождения символа в строку; Переопределить следующие операции: сложение (+) - операция конкатенации строк; вычитание (-) — из строки (первый операнд) удаляются все символы, входящие в строку, — второй операнд, при этом может получиться пустая строка. Написать демонстрационную программу.

5. Описать базовый класс CStr – строка (см. вариант 1). Описать производный от CStr класс CСomplex– комплексное число. Строки данного класса состоят из двух полей, разделенных символом i. Каждое из полей может содержать только символы десятичных цифр и символы + и -, задающие знак числа. Символы + и – могут находиться только в первой позиции числа, причем символ + может отсутствовать. Если исходные данные противоречат правилам записи комплексного числа, то комплексное число принимает нулевое значение. Класс CStr_ID содержит следующие методы: конструктор без параметров; конструктор, принимающий в качестве параметра строку типа string, свойства. Переопределить следующие операции: операция (==) – проверка на равенство; умножение (*). Написать демонстрационную программу.

6. Создать класс CPoint — точка. На его основе создать классы CcoloredPoint – цветная точка и Cline - линия. На основе класса CLine создать класс CcoloredLine – цветная линия. Все классы должны иметь методы для установки и получения значений всех координат. Классы CcoloredPoint и CcoloredLine должны иметь обязательные поля – 2 точки и имя, обязательные методы для изменения цвета и получения текущего цвета. Классы CLine и CcoloredLine должны иметь конструкторы без параметров, конструктор, принимающий в качестве параметров 2 точки (и цвет), свойства. Определить методы, проверяющие, являются ли линии параллельные, перпендикулярными. Переопределить операцию сравнения (==) – проверка на совпадение линий. Написать демонстрационную программу.

7. Описать класс Cpoint - точка. Описать класс прямоугольник CRectangle. Обязательные поля класса CRectangle: - имя прямоугольника, 4 объекта класса CPoint, 4 поля типа double – стороны прямоугольника. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого прямоугольника); конструктор, принимающий в качестве параметра 4 точки, свойства для каждого поля; метод получения площади, метод получения периметра. Описать производный класс CQuadrate – квадрат. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого квадрата); конструктор, принимающий в качестве параметра 4 точки, свойства; метод получения площади, метод получения периметра. Переопределить операцию (==) – сравнение по площади. Написать демонстрационную программу.

8. Описать класс CPoint - точка. Описать класс прямоугольник CRectangle (см. вариант 7). Описать производный класс CTrapezoid – трапеция. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого квадрата); конструктор, принимающий в качестве параметра 4 точки, свойства, метод получения площади, метод получения периметра, метод, проверяющий, является ли трапеция равнобедренной. Для классов CRectangle и CTrapezoid определить метод, проверяющий две фигуры на пересечение. Написать демонстрационную программу.

9. Описать класс CPoint - точка. Описать класс четырехугольник CTetragon. Обязательные поля класса CTetragon: имя прямоугольника, 4 объекта класса CPoint, 4 поля типа double – стороны четырех угольника. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого прямоугольника); конструктор, принимающий в качестве параметра 4 точки, свойства, метод получения периметра. Переопределить операцию операцию (<) – сравнение по длине периметра. Описать производный класс CRectangle – прямоугольник. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого квадрата); конструктор, принимающий в качестве параметра 4 точки, свойства; метод получения периметра. Переопределить операцию (<) – сравнение по длине периметра. Для классов CTetragon и CRectangle определить метод, определяющий факт включения одной фигуры в другую. Написать демонстрационную программу.

10. Описать класс CPoint - точка. Описать класс четырехугольник CTetragon (см. задачу 9). Описать производный класс СParallelogram – параллелограмм. Обязательные методы должны выполнять следующие действия: конструктор без параметров (нулевого параллелограмма); конструктор, принимающий в качестве параметра 4 точки, свойства; метод получения площади, метод получения периметра. Переопределить операцию (<) – сравнения по площади. Для классов CTetragon и СParallelogram определить метод, перемещения на плоскости. Написать демонстрационную программу.

 

Глава 9. Итерфейсы

В программировании слово «Интерфейс» может иметь несколько значений. До этого момента открытые элементы класса мы называли его интерфейсом, так как именно через них осуществляется работа с объектами класса.

В данной лекции мы рассмотрим интерфейсы языка С#.

Интерфейс в С# - это абстрактный класс, содержащий только абстрактные методы.

Отличия интерфейса от абстрактного класса:

- интерфейс не может содержать полей и обычных методов — все элементы интерфейса должны быть абстрактными методами;

- методы интерфейса описываются без спецификатора доступа (по умолчанию имеют спецификатор доступа public);

- класс, в списке предков которого задается интерфейс, должен определять все его элементы;

- класс может иметь в списке предков несколько интерфейсов.

Синтаксис интерфейса аналогичен синтаксису класса:

[ атрибуты ] [ спецификаторы ] interface имя_интерфейса [: предки ]

{тело_интерфейса }

Интерфейсы позволяют частично реализовать идею множественного наследования классов, что расширяет возможности языка. В языке C# фактически каждый класс может иметь несколько родителей - один полноценный класс, а остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.

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

В библиотеке классов.NET большое число интерфейсов, наследуя которые, классы получают полезные дополнительные свойства, некоторые из них будут рассмотрены ниже. Например, интерфейс IComparable задает метод сравнения объектов на больше-меньше, что позволяет выполнять их сортировку.

Пречислим правила описания интерфейсов.

1. Для интерфейса могут быть указаны спецификаторы new, public, protected, internal и private.

2. По умолчанию интерфейс доступен только из сборки, в которой он описан (internal).

3. Интерфейс может не иметь или иметь сколько угодно предков-интерфейсов.

4. Если интерфейс имеет несколько предков, то предки в заголовке интерфейса перечисляются через запятую.

5. Тело интерфейса составляют абстрактные методы, шаблоны свойств и индексаторов, а также события.

В качестве примера рассмотрим интерфейс Ioutput, определяющий методы вывода на экран общих данных для всех членов университета, например вывод ФИО, даты рождения, номер паспорта и т.д.

interface IOutput

{

void outputName();

...

}

В интерфейсе могут быть заданы также шаблоны свойств. В этом случае в абстрактном свойстве следует указать какие из секций (get, set) должны присутствовать, например:

sting Name { get; set; }

Реализация интерфейса происходит в классе, который его наследует. В списке предков класса сначала указывается его базовый класс, если он есть, а затем через запятую интерфейсы, которые реализует этот класс. Например, реализация интерфейса IOutput в классе CStudent может выглядеть следующим образом:

namespace ConsoleApplication1

{

interface IOutput

{

void outputName();

...

}

 

class CStudent: IOutput

{

public void outputName()

{

Console.WriteLine("ФИО студента: "+ name);

}

}

 

class CLector: IOutput

{

public void outputName()

{

Console.WriteLine("ФИО преподавателя: "+ name);

}

}

 

Заголовки методов в интерфейсе и реализации должны полностью совпадать.

Заметим, что методы интерфейса могут быть реализованы в классе наследнике как открытые и как закрытые. В нашем примере метод outputName реализован как открытый.

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

CStudent s1 = new CStudent("Сидорова", "Информатика", gender_type.female, 1);

s1.outputName();

Ioutput s2 = new CStudent("Иванов", "Математика", gender_type.male, 2);

s2.outputName();

Второй способ удобен тем, что объектам типа интерфейса можно присваивать объекты различных классов, поддерживающих этот интерфейс

static void output (IOutput A) {A.outputName();}

 

CStudent ob1=new CStudent();

CLector ob2= CLector ();

output(ob1);// ФИО студента: Unknown

output (ob2);// ФИО преподавателя: Unknown

При работе с некоторым объектом бывает необходимо убедиться, что объект поддерживает данный интерфейс. Проверка выполняется с помощью бинарной операции is.

имя_объекта is имя_типа данных

Эта операция определяет, совместим ли текущий тип объекта, находящегося слева от ключевого слова is, с типом, заданным справа. Результат операции равен true, если объект можно преобразовать к заданному типу, и false в противном случае.

Операцию обычно используют с целью последующего явного преобразования объекта к типу интерфейса.

Например, определен метод с параметром типа object. Прежде чем использовать этот параметр для обращения к методам интерфейса требуется выполнить преобразование параметра к типу интерфейса. Для безопасного преобразования следует проверить, возможно ли оно, например так:

static void output(object A)

{

if (A is IOutput)

{

((IOutput)A).outputName();

}

}

В метод output можно передавать любые объекты, но на экран будут выведены только те, которые поддерживают интерфейс IOutput.

Недостатком использования операции is является то, что преобразование фактически выполняется дважды: при проверке и при собственно преобразовании. Более эффективной является другая операция — as. Она выполняет преобразование к заданному типу, а если это невозможно, формирует результат null, например:

static void output(object A)

{

IOutput person = A as IOutput;

if (person!= null) person. outputName ();

}

Обе рассмотренные операции применяются как к интерфейсам, так и к классам.

В библиотеке классов.NET определено множество стандартных интерфейсов, задающих желаемое поведение объектов. Например, интерфейс IComparable задает метод сравнения объектов на больше-меньше, что позволяет выполнять их сортировку. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable — клонировать объекты.

Стандартные интерфейсы поддерживаются многими стандартными классами библиотеки. Например, работа с массивами с помощью цикла foreach возможна именно потому, что тип Array реализует интерфейсы IEnumerable и IEnumerator. Можно создавать и собственные классы, поддерживающие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.

Сравнение объектов

Интерфейс IComparable определен в пространстве имен System. Он содержит всего один метод CompareTo, возвращающий результат сравнения двух объектов — текущего и переданного ему в качестве параметра:

interface IComparable

{

int CompareTo(object obj)

}

Метод должен возвращать:

- 0, если текущий объект и параметр равны;

- отрицательное число, если текущий объект меньше параметра;

- положительное число, если текущий объект больше параметра.

Реализуем интерфейс IComparable в классе CStudent. В качестве критерия сравнения объектов выберем поле Name. В функции Main приведена программа, сортирующая массив монстров по возрастанию ФИО.

using System;

namespace ConsoleApplication1

{

class CStudent: IComparable

{

public int CompareTo(object obj) // реализация интерфейса

{

CStudent temp = (CStudent)obj;

return String.Compare(this.name,temp.name);

 

}

}

class Class1

{ static void Main()

{

CStudent[] ar = {

new CStudent ("Петров", "Информатика", gender_type.male, 1),

new CStudent ("Сидоров", "Экономика", gender_type.male, 2),

new CStudent ("Уткин", "Математика", gender_type.male, 1),

new CStudent("Иванова", "Информатика", gender_type.female, 3),

new CStudent ("Антонова", "Информатика", gender_type.female, 1),

new CStudent ("Макаров", "Информатика", gender_type.male, 1)

};

 

Array.Sort(ar);// сортировка стала возможной

foreach (CStudent elem in ar) elem.output();

}

}

}

Во многих алгоритмах требуется выполнять сортировку объектов по различным критериям. В C# для этого используется интерфейс IComparer, который мы рассмотрим далее.

Сортировка по разным критериям (интерфейс IComparer)

Интерфейс IComparer определен в пространстве имен System.Collections. Он содержит один метод Compare, возвращающий результат сравнения двух объектов, переданных ему в качестве параметров:

interface IComparer

{

int Compare(object ob1, object ob2)

}

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

Ниже приведен пример сортировки массива объектов из предыдущего примера по специальности (speciality) и году обучения (year_tr).

using System;

using System.Collections;

namespace ConsoleApplication1

{

class CStudent

{

public class SortBySpec: IComparer

{

public int Compare(object ob1, object ob2)

{

CStudent m1 = (CStudent)ob1;

CStudent m2 = (CStudent)ob2;

return String.Compare(m1.speciality, m2.speciality);

}

}

 

public class SortByYear: IComparer //

{

public int Compare(object ob1, object ob2)

{

CStudent m1 = (CStudent)ob1;

CStudent m2 = (CStudent)ob2;

if (m1.year_tr > m2.year_tr) return 1;

if (m1.year_tr < m2.year_tr) return -1;

return 0;

}

}

 

}

 

class Class1

{ static void Main()

{

CStudent[] ar = {

new CStudent ("Петров", "Информатика", gender_type.male, 1),

new CStudent ("Сидоров", "Экономика", gender_type.male, 2),

new CStudent ("Уткин", "Математика", gender_type.male, 1),

new CStudent("Иванова", "Информатика", gender_type.female, 3),

new CStudent ("Антонова", "Информатика", gender_type.female, 1),




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 727; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.175 сек.