Операции преобразования типа обеспечивают возможность явного и неявного преобразования между пользовательскими типами данных. Синтаксис объявителя операции преобразования типа:
implicit operator тип (параметр) // неявное преобразование
explicit operator тип (параметр) // явное преобразование
Эти операции выполняют преобразование из типа параметра в тип, указанный в заголовке операции. Одним из этих типов должен быть класс, для которого определяется операция. Таким образом, операции выполняют преобразование либо типа класса к другому типу, либо наоборот. Преобразуемые типы не должны быть связаны отношениями наследования. Примеры операций преобразования типа для класса Monster, описанного ранее:
public static implicit operator int(Monster m)
{
return m.health;
}
public static explicit operator Monster(int h)
{
return new Monster(h, 100, "FromInt");
}
Ниже приведены примеры использования этих преобразований в програмне (это просто иллюстрация синтаксиса):
Monster Masha = new Monster(200, 200, "Masha");
int i = Masha; // неявное преобразование
Masha = (Monster) 500; // явное преобразованиеНеявное преобразование выполняется автоматически:
· при присваивании объекта переменной целевого типа, как в примере;
· при использовании объекта в выражении, содержащем переменные целевого типа;
· при передаче объекта в метод на место параметра целевого типа;
· при явном приведении типа.
Явное преобразование выполняется при использовании операции приведения типа.
Все операции класса должны иметь разные сигнатуры. В отличие от других видов методов, для операций преобразования тип возвращаемого значения включается в сигнатуру, иначе нельзя было бы определять варианты преобразования данного типа в несколько других. Ключевые слова implicit и explicit в сигнатуру не включаются, следовательно, для одного и того же преобразования нельзя определить одновременно явную и неявную версию.
|
Неявное преобразование следует определять так, чтобы при его выполнении не возникала потеря точности и не генерировались исключения. Если эти ситуации возможны, преобразование следует описать как явное.
Деструкторы
В C# существует специальный вид метода, называемый деструктором. Он вызывается сборщиком мусора непосредственно перед удалением объекта из памяти. В деструкторе описываются действия, гарантирующие корректность последующего удаления объекта, например, проверяется, все ли ресурсы, используемые объектом, освобождены (файлы закрыты, удаленное соединение разорвано и т. п.)
Синтаксис деструктора:
[ атрибуты ] [ extern ] ~имя_класса()телоКак видно из определения, деструктор не имеет параметров, не возвращает значения и не требует указания спецификаторов доступа. Его имя совпадает с именем класса и предваряется тильдой (~), символизирующей обратные по отношению к конструктору действия. Тело деструктора представляет собой блок или просто точку с запятой, если деструктор определен как внешний (extern).
Сборщик мусора удаляет объекты, на которые нет ссылок. Он работает в соответствии со своей внутренней стратегией в неизвестные для программиста моменты времени. Поскольку деструктор вызывается сборщиком мусора, невозможно гарантировать, что деструктор будет обязательно вызван в процессе работы программы. Следовательно, его лучше использовать только для гарантии освобождения ресурсов, а «штатное» освобождение выполнять в другом месте программы.
|
Вложенные типы
В классе можно определять типы данных, внутренние по отношению к классу. Так определяются вспомогательные типы, которые используются только содержащим их классом. Механизм вложенных типов позволяет скрыть ненужные детали и более полно реализовать принцип инкапсуляции. Непосредственный доступ извне к такому классу невозможен (имеется в виду доступ по имени без уточнения). Для вложенных типов можно использовать те же спецификаторы, что и для полей класса.
Например, введем в класс Monster вспомогательный класс Gun. Объекты этого класса без «хозяина» бесполезны, поэтому его можно определить как внутренний:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
{ class Monster
{
class Gun
{
...
}
}
}Помимо классов, вложенными могут быть и другие типы данных: интерфейсы, структуры и перечисления.
Индивидуальные задания:
Каждый разрабатываемый класс должен, как правило, содержать следующие элементы: скрытые поля, конструкторы с параметрами и без параметров, методы; свойства, индексаторы; перегруженные операции. Функциональные элементы класса должны обеспечивать непротиворечивый, полный, минимальный и удобный інтерфейс класса. При возникновении ошибок должны выбрасываться исключения. В программе должна выполняться проверка всех разработанных элементов класса.
Вариант 1
Описать класс для работы с одномерным массивом целых чисел (вектором).
Обеспечить следующие возможности:
• задание произвольных целых границ индексов при создании объекта;
|
• обращение к отдельному элементу массива с контролем выхода за пределы массива;
• выполнение операций поэлементного сложения и вычитания массивов с одинаковыми границами индексов;
• выполнение операций умножения и деления всех элементов массива на скаляр;
• вывод на экран элемента массива по заданному индексу и всего массива.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 2
Описать класс для работы с одномерным массивом строк фиксированной длины.
Обеспечить следующие возможности:
• задание произвольных целых границ индексов при создании объекта;
• обращение к отдельной строке массива по индексу с контролем выхода за пределы массива;
• выполнение операций поэлементного сцепления двух массивов с образованием нового массива;
• выполнение операций слияния двух массивов с исключением повторяющихся элементов;
• вывод на экран элемента массива по заданному индексу и всего массива.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 3
Описать класс многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Обеспечить следующие возможности:
• вычисление значения многочлена для заданного аргумента;
• операции сложения, вычитания и умножения многочленов с получением нового объекта-многочлена;
• получение коэффициента, заданного по индексу;
• вывод на экран описания многочлена.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 4
Описать класс, обеспечивающий представление матрицы произвольного раз мера с возможностью изменения числа строк и столбцов, вывода на экран подматрицы любого размера и всей матрицы, доступа по индексам к элементу матрицы.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 5
Описать класс для работы с восьмеричным числом, хранящимся в виде строки символов. Реализовать конструкторы, свойства, методы и следующие операции:
• операции присваивания, реализующие значимую семантику;
• операции сравнения;
• преобразование в десятичное число;
• форматный вывод;
• доступ к заданной цифре числа по индексу.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 6
Описать класс ≪домашняя библиотека≫. Предусмотреть возможность работы с произвольным числом книг, поиска книги по какому-либо признаку (по автору, по году издания или категории), добавления книг в библиотеку, удаления книг из нее, доступа к книге по номеру.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 7
Описать класс ≪записная книжка≫. Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по фамилии и доступа к записи по номеру.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 8
Описать класс ≪студенческая группа≫. Предусмотреть возможность работы с переменным числом студентов, поиска студента по какому-либо признаку (напримep, по фамилии, имени, дате рождения), добавления и удаления записей, сортировки по разным полям, доступа к записи по номеру.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 9
Описать класс, реализующий тип данных ≪вещественная матрица≫ и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• сложение, вычитание (как с другой матрицей, так и с числом);
• комбинированные операции присваивания (+=, -=);
• операции сравнения на равенство/неравенство;
• операции вычисления обратной и транспонированной матрицы;
• доступ к элементу по индексам.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 10
Описать класс, реализующий тип данных ≪вещественная матрица≫ и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• умножение, деление (как на другую матрицу, так и на число);
• комбинированные операции присваивания (*=, /=);
• операцию возведения в степень;
• методы вычисления детерминанта и нормы;
• доступ к элементу по индексам.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 11
Описать класс, реализующий тип данных ≪вещественная матрица≫ и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• методы, реализующие проверку типа матрицы (квадратная, диагональная, нулевая, единичная, симметричная, верхняя треугольная, нижняя треугольная);
• операции сравнения на равенство/неравенство;
• доступ к элементу по индексам.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 12
Описать класс ≪множество≫, позволяющий выполнять основные операции: добавление и удаление элемента, пересечение, объединение и разность множеств.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 13
Описать класс ≪предметный указатель≫. Каждый компонент указателя содержит слово и номера страниц, на которых, это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти. Предусмотреть возможность формирования указателя с клавиатуры и из файла, вывода указателя, вывода номеров страниц для заданного слова, удаления элемента из указателя.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 14
Описать класс ≪автостоянка≫ для хранения сведений об автомобилях. Для каждого автомобиля записываются госномер, цвет, фамилия владельца и признак присутствия на стоянке. Обеспечить возможность поиска автомобиля по разным критериям, вывода списка присутствующих и отсутствующих на стоянке автомобилей, доступа к имеющимся сведениям по номеру места.
Написать программу, демонстрирующую все разработанные элементы класса.
Вариант 15
Описать класс ≪колода карт≫, включающий закрытый массив элементов класса ≪карта≫. В карте хранятся масть и номер. Обеспечить возможность вывода карты по номеру, вывода всех карт, перемешивания колоды и выдачи всех карт из колоды поодиночке и по 6 штук в случайном порядке.
Написать программу, демонстрирующую все разработанные элементы классов.
Вариант 16
Описать класс ≪поезд≫, содержащий следующие закрытые поля:
• название пункта назначения;
• номер поезда (может содержать буквы и цифры);
• время отправления.
Предусмотреть свойства для получения состояния объекта.
Описать класс ≪вокзал≫, содержащий закрытый массив поездов. Обеспечить следующие возможности:
• вывод информации о поезде по номеру с помощью индекса;
• вывод информации о поездах, отправляющихся после введенного с клавиатуры времени;
• перегруженную операцию сравнения, выполняющую сравнение времени отправления двух поездов;
• вывод информации о поездах, отправляющихся в заданный пункт назначения.
Информация должна быть отсортирована по времени отправления. Написать программу, демонстрирующую все разработанные элементы классов.
Вариант 17
Описать класс ≪товар≫, содержащий следующие закрытые поля:
• название товара;
• название магазина, в котором продается товар;
• стоимость товара в рублях.
Предусмотреть свойства для получения состояния объекта.
Описать класс ≪склад≫, содержащий закрытый массив товаров. Обеспечить следующие возможности:
• вывод информации о товаре по номеру с помощью индекса;
• вывод на экран информации о товаре, название которого введено с клавиатуры; если таких товаров нет, выдать соответствующее сообщение;
• сортировку товаров по названию магазина, по наименованию и по цене;
• перегруженную операцию сложения товаров, выполняющую сложение их цен.
Написать программу, демонстрирующую все разработанные элементы классов.
Вариант 18
Описать класс ≪самолет≫, содержащий следующие закрытые поля:
• название пункта назначения;
• шестизначный номер рейса;
• время отправления.
Предусмотреть свойства для получения состояния объекта.
Описать класс ≪аэропорт≫, содержащий закрытый массив самолетов. Обеспечить следующие возможности:
• вывод информации о самолете по номеру рейса с помощью индекса;
• вывод информации о самолетах, отправляющихся в течение часа после введеного с клавиатуры времени;
• вывод информации о самолетах, отправляющихся в заданный пункт назначения;
• перегруженную операцию сравнения, выполняющую сравнение времени отправления двух самолетов.
Информация должна быть отсортирована по времени отправления. Написать программу, демонстрирующую все разработанные элементы классов.
Вариант 19
Описать класс ≪запись≫, содержащий следующие закрытые поля:
• фамилия, имя;
• номер телефона;
• дата рождения (массив из трех чисел).
Предусмотреть свойства для получения состояния объекта.
Описать класс ≪записная книжка≫, содержащий закрытый массив записей. Обеспечить следующие возможности:
• вывод на экран информации о человеке, номер телефона которого введен с клавиатуры; если такого нет, выдать на дисплей соответствующее сообщение;
• поиск людей, день рождения которых сегодня или в заданный день;
• поиск людей, день рождения которых будет на следующей неделе;
• поиск людей, номер телефона которых начинается на три заданных цифры.
Написать программу, демонстрирующую все разработанные элементы классов.
Вариант 20
Описать класс ≪англо-русский словарь≫, обеспечивающий возможность хранения нескольких вариантов перевода для каждого слова. Реализовать доступ по строковому индексу – английскому слову. Обеспечить возможность вывода всех значений слов по заданному префиксу.