Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы_ТП

.pdf
Скачиваний:
34
Добавлен:
21.05.2015
Размер:
880.4 Кб
Скачать

Рассмотрим версию класса 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 ("Результат вычитания с - а: " ) ;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]