Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5677 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 6:

Перегруженные операции

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Бинарные операции. Пример объявления и вызова

Семантика перегружаемой операторной функции определяется решаемыми задачами и фантазией разработчика:

// Бинарные операции также обязаны возвращать значения!
public static Point2D operator + (Point2D par1, Point2D par2)
{
return new Point2D(par1.x+par2.x,par1.y+par2.y);
}

// Реализуется алгоритм "сложения" значения типа Point2D
// со значением типа float.
// От перемены мест слагаемых сумма НЕ ИЗМЕНЯЕТСЯ.
// Однако эта особенность нашей
// операторной функции "сложения" (операции "сложения") должна быть 
// прописана программистом.
// В результате получаем ПАРУ операторных функций, которые отличаются
// списками параметров. 
// Point2D + float	
public static Point2D operator + (Point2D par1, float val)
{
return new Point2D(par1.x+val,par1.y+val);
}

// float + Point2D	
public static Point2D operator + (float val, Point2D par1)
{
return new Point2D(val+par1.x,val+par1.y);
}

А вот применение этих функций. Внешнее сходство выражений вызова операторных функций с обычными выражениями очевидно. И при этом иного способа вызова операторных функций нет!

...p1 + p2...
...3.14 + p2...
...p2 + 3.14...

Операции сравнения реализуются по аналогичной схеме. Хотя не существует никаких ограничений на тип возвращаемого значения, в силу специфики применения (обычно в условных выражениях операторов управления) операций сравнения все же имеет смысл определять их как операторные функции, возвращающие значения true и false:

public static bool operator == (myPoint2D par1, myPoint2D par2)
{
    if ((par1.x).Equals(par2.x) && (par1.y).Equals(par2.y))
	return true;
    else
	return false;
}

public static bool operator != (myPoint2D par1, myPoint2D par2)
{
if (!(par1.x).Equals(par2.x) || !(par1.y).Equals(par2.y))
	return true;
else
	return false;
}
operator true и operator false

В известном мультфильме о Винни Пухе и Пятачке, Винни делает заключение относительно НЕПРАВИЛЬНОСТИ пчел. Очевидно, что по его представлению объекты — представители ДАННОГО класса пчел НЕ удовлетворяют некоторому критерию.

В программе можно поинтересоваться непосредственно значением некоторого поля объекта:

Point2D p1 = new Point2D(GetVal(), GetVal());
 ::::::::::
// Это логическое выражение!
if ((p1.x).Equals(125)) {/*...*/}

Так почему же не спросить об этом у объекта напрямую?

Хотя бы так:

// Критерий истинности объекта зависит от разработчика.
// Если значение выражения в скобках примет значение true,
// то пчела окажется правильной!  
if (p1) {/*...*/}

В классе может быть объявлена операция (операторная функция) true, которая возвращает значение true типа bool для обозначения факта true и возвращает false в противном случае.

Классы, включающие объявления подобных операций (операторных функций), могут быть использованы в структуре операторов if, do, while, for в качестве условных выражений.

При этом, если в классе была определена операция true, в том же классе должна быть объявлена операция false:

// Перегрузка булевских операторов. Это ПАРНЫЕ операторы.
// Объекты типа Point2D приобретают способность судить о правде и лжи! 
// А что есть истина? Критерии ИСТИННОСТИ (не путать с истиной)
// могут быть самые разные. В частности, степень удаления от точки
// с координатами (0,0). 
public static bool operator true (Point2D par)
{
if (Math.Sqrt(par.x*par.x + par.y*par.y) < 10.0) return true;
else                                         	return false;
}

public static bool operator false (Point2D par)
{
double r = (Math.Sqrt(par.x*par.x + par.y*par.y));  
if (r > 10.0 || r.Equals(10.0))               	return false;
else                                        	return true;
}
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2