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

Ответы по Технологии программирования / Перегрузка операторов отношений и преобразования

.docx
Скачиваний:
8
Добавлен:
21.05.2015
Размер:
8.66 Кб
Скачать

4.3.4Перегрузка операторов отношений

Операторы отношений (например, "==" или "<") также можно перегружать. Как правило, перегруженный оператор отношения возвращает одно из двух возможных значений: true или false. Это позволяет использовать перегруженные операторы отношений в условных выражениях.

Рассмотрим версию класса 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, ThreeD 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, именуемого оператором преобразования. Такой оператор преобразует объект некоторого класса в значение другого типа. По сути, оператор преобразования перегружает оператор приведения типов. Операторы преобразования способствуют полной интеграции классовых типов в С#-среду программирования, позволяя объектам класса свободно смешиваться с данными других типов при условии определения операторов преобразования в эти "другие типы".

Существуют две формы операторов преобразования: явная и неявная. В общем виде они записываются так:

public static explicit operator тип_результата(исходный__тип 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;}