Ответы_ТП
.pdfРассмотрим версию класса ThreeD, который перегружает операторы "<" и ">".
// Перегрузка операторов "<" и ">". usingSystem;
// Класс трехмерных координат, classThreeD {
int x, у, z; // 3 -х-мерные координаты. publicThreeD () { х = у = z = 0; } publicThreeD(inti, int j , int k) {
x = i; у = j ; z = k; }
// Перегрузка оператора "<".
public static bool operator <(ThreeD opl, ThreeD op2)
{
if((opl.x< op2.x) && (opl. у< op2.y) && (opl. z< op2. z))
return true; else
return false;
}
// Перегрузкаоператора ">".
public static bool operator >(ThreeD opl, Thre eD op2)
{
if((opl.x> op2.x) && (opl. у> op2.y) && (opl. z> op2. z))
return true; else
return false;
}
// Отображаемкоординаты X, Y, Z. public void show()
{
Console.WriteLine(x + ", " + у + ", " + z);
}
}
class ThreeDDemo { public static void Main() {
ThreeD a = new ThreeD(5, 6, 7); ThreeD b = new ThreeD(10, 10, 10); ThreeD с = new ThreeD(1, 2, 3);
Console.Write(" Координатыточкиа : " ) ; a.show();
Console.Write(" Координатыточки b: " ) ; b.show();
Console.Write(" Координатыточкис: " ) ;
с.show();
Console.WriteLine() ;
if(a > c) Console.WriteLine("a > с - ИСТИНА") if(a < c) Console.WriteLine("a < с - ИСТИНА")
if(a > b) Console.WriteLine("a > b - ИСТИНА")
if(a < b) Console.WriteLine("a < b - ИСТИНА")
}
}
При выполнении эта программа генерирует такие результаты:
Координаты точки а: 5, 6, 7
Координаты точки Ь: 10, 10, 10
Координаты точки с: 1, 2, 3
а>с - ИСТИНА
а< b - ИСТИНА
На перегрузку операторов отношений налагается серьезное ограничение: их следует перегружать парами. Например, перегружая оператор "<", вы также должны перегрузить оператор ">", и наоборот. Вот что подразумевается под парами операторов отношений:
Перегружая операторы " ==" и " != " , следует перегрузить также методы Object.Equals() и Object.GetHashCode().
4.3.5 Операторы преобразования
Иногда объект класса нужно использовать в выражении, включающем другие типы данных. Такие средства может обеспечить перегрузка одного или нескольких операторов. Но в некоторых случаях желаемого результата можно достичь за счет преобразовани я типов (из классового в нужный). В целях обработки подобных ситуаций С# позволяет создавать специальный тип операторного метода operator, именуемого оператором преобразования. Такой оператор преобразует объект некоторого класса в значение другого типа. По сути, оператор преобразования перегружает оператор приведения типов. Операторы
преобразования способствуют полной интеграции классовых типов в С#- среду программирования, позволяя объектам класса свободно смешиваться с данными других типов при условии опре деления операторов преобразования в эти "другие типы".
Существуют две формы операторов преобразования: явная и неявная. В общем виде они записываются так:
publicstaticexplicitoperator тип_результата(исходный__тип v) [return значение; ]
public static implicit operator тип_результата (исходный_тип v) [return значение;]
Здесь элемент тип_результата представляет собой тип, в который вы хотите выполнить преобразование; элемент исходный_тип означает тип объекта, подлежащего преобразованию; элемент v — значение класса после преобразования. Операторы преобразования возвращают данные типа тип_результата, причем спецификатор типа здесь указывать не разрешается.
Если оператор преобразования определен с ключевым словом implicit, преобразование выполняется автоматически, т.е. при использовании объекта в выражении, включающем данные типа тип_результата. Если оператор преобразования определен с ключевым словом explicit, преобразование выполняется при использовании оператора приведения типов. Для одной и той же пары типов, участвующих в преобразовании, нельзя определить как explicit -, так и implicit-оператор преобразования.
Для иллюстрации определения и использования оператора преобразования создадим его для класса ThreeD. Предположим, необходимо преобразовать о бъект типа ThreeD в целочисленное значение, чтобы его можно было использовать в выражениях типа int. Это преобразование будет заключаться в вычислении произведения значений всех трех координат объекта. Для реализации такого преобразования используем implicit-форму оператора, который будет иметь такой вид:
public static implicit operator int(ThreeD opl)
{return opl.x * opl.у * opl. z;}
33. Перечисление_ описание и назначение
Перечисление(enumeration) — это множество именованных целочисленных констант. Ключевое слово enum объявляет перечислимый тип. Формат записи перечисления таков:
enum имя {список_перечисления);
Здесь с помощью элемента имя указывается имя типа перечисления. Элемент список_перечисления представляет собой список идентификаторов, разделенных запятыми.
Рассмотрим пример. В следующем фрагменте кода определяется перечислениеapple, которое содержит список названий различных сортов яблок.
enum apple { Jonathan, GoldenDel, RedDel, Winsap,
Cortland, Mclntosh } ;
Каждый символ списка перечисления означает целоечисло, причем каждое следующее число (представленное идентификатором) на единицу больше предыдущего. Поскольку значение первого символа перечисления равнонулю, следовательно, идентифика тор Jonathan имеет значение 0, GoldenDel — значение 1 и т.д.
Константу перечисления можно использовать везде, где допустимо целочисленноезначение. Однако между типом enum и встроенным целочисленным типом неявныепреобразования не определены, поэтому при необходимости должна использоватьсяявно заданная операция приведения типов. В случае преобразования одного типа перечисления
вдругой также необходимо использовать приведение типов.
Кчленам перечисления доступ осуществляется посредством имени типа и оператор а "точка". Например, при выполнении инструкции
Console.WriteLine(apple.RedDel |
+ |
" |
имеетзначение |
" |
+(int)apple.RedDel); |
|
|
|
|
будет отображено следующее.
RedDel имеет значение 2
Как подтверждает результат выполнения этой инструкции, при отображении значения переч ислимого типа используется его имя. А для получения его целочисленногозначения необходимо использовать операцию приведения к типу int. (В этом заключается отличие от ранних версий С#, в которых по умолчанию отображалось целочисленное представление значения перечислимого типа, а не его имя.)
Рассмотрим программу, которая демонстрирует использование перечисления apple.
// Демонстрация использования перечисления.
usingSystem;
classEnumDemo {
enum apple { Jonathan, GoldenDel, RedDel, Winsap,
Cortland, Mclntosh };
public static void Main() {
string[] color = {"красный", "желтый", "красный", "красный", "красный", "красно -зеленый"};
apple i; // Объявляем переменную перечислимого типа.
//Используем переменную i для обхода всех
//членовперечисления.
for(i = apple.Jonathan; i <= apple.Mclntosh; i++)
Console.WriteLine(i + " имеетзначение " + (int)i);
Console.WriteLine() ;
// Используем перечисление для индексации массива.
for(i = apple.Jonathan; i <= apple.Mclntosh; i++)
Console.WriteLine(" Цветсорта " + i + " - " +
color[(int)i]);
}}
Результаты выполнения этой программы таковы:
Jonathan имеет значение О
GoldenDel имеет значение 1
RedDel имеет значение 2
Winsap имеет значение 3
Cortland имеет значение 4
Mclntosh имеет значение 5
Цвет сорта Jonathan - красный
Цвет сорта GoldenDel - желтый
Цвет сорта RedDel - красный
Цвет сорта Winsap - красный
Цвет сорта Cortland - красный
Цвет сорта Mclntosh - красно -зеленый
Обратите внимание на то, как for-циклы управляются переменной типа apple. Поскольку перечисление — это целочисленный тип, значение перечисления может быть использовано везде, где допустимы целые значения. Поскольку значения перечислимого типа начинаются с нуля, их можно использовать для инд ексирования массива color (чтобы получить цвет яблок). Заметьте: в этом случае необходимо выполнить приведение типа. Как упоминалось выше, неявные преобразования
между целочисленными и перечислимыми типами не определены. Поэтому без явно заданного приведен ия типа здесь не обойтись.
Поскольку перечислимые типы представляют собой целочисленные значения, их можно использовать для управления switch-инструкцией.
34. Понятие класса
Класс является типом данных, определяемым пользователем. Он должен представлять собой одну логическую сущность, например, являться моделью реаль ного объекта или процесса. Элементами класса являются данные и функции, предназначенные для их обработки.
35. Перегр узка операторов (Унарных и бинарных)
4.3.1 Перегрузка бинарных операторов
В следующей программе создаѐтся класс ThreeD поддержки координат объекта в трехмерном пространстве.
Перегруженный оператор "+" выполняет сложение отдельных координат двух ThreeD-объектов, а перегруженный оператор " -" вычитает координаты одного ThreeD-объекта из координат другого.
// Пример перегрузки операторов.
usingSystem;
// Класс трехмерных координат,
classThreeD {
int x, у, z; // 3 -х-мерные координаты.
publicThreeD () { x = у = z = 0; }
publicThreeD(int i, int j, int k) {
x = i; у = j; z=k;}
// Перегрузка бинарного оператора "+".
public static ThreeD operator +(ThreeD opl,ThreeD op2)
{
ThreeD result = newThreeD();
/* Суммированиекоординатдвухточек и возврат результата. */
result.x = opl.x + op2.x; // Эти операторы выполняют result.у = opl.у + ор2.у; // целочисленное сложение, result. z = opl. z + op2.z;
returnresult;
}
// Перегрузка бинарного оператора " -".
public static ThreeD operator -(ThreeD opl, ThreeD op2)
{
ThreeD result = new ThreeD();
/* Обратите внимание на порядок операндов. opl - левый операнд, ор2 - правый. */
result.х = opl.x - ор2.х; // Эти операторы выполняют result.у = opl.у - ор2.у; // целочисленное вычитание, result. z = opl. z - op2.z;
return result;
}
// Отображаем координаты X, Y, Z. public void show()
{
Console.WriteLine(x + ", " + у + ", " + z) ;
}}
classThreeDDemo { public static void Main() {
ThreeD a = new ThreeD(1, 2, 3);
ThreeD b = new ThreeD(10, 10, 10);
ThreeD с = new ThreeD();
Console.Write("Координаты точки а: " ) ; a.show();
Console.WriteLine();
Console.Write("Координаты точки b: " ) ; b. show() ;
Console.WriteLine();
с = a + b; // Складываем а и b.
Console.Write ("Результат сложения а + b: " ) ;
с.show();
Console.WriteLine();
c = a + b + c ; // Складываем a, b ис.
Console.Write ("Результат сложения а + b + с: " ) ;
с.show();
Console.WriteLine();
с = с - a; // Вычитаем а из с.
Console.Write ("Результат вычитания с - а: " ) ;
