Операции преобразования типа




Операции преобразования типа обеспечивают возможность явного и неявного преобразования между пользовательскими типами данных. Синтаксис объявителя операции преобразования типа:

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: