
Ответы по Технологии программирования / Перегрузка операторов отношений и преобразования
.docx4.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;}