Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Бинарные операции

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

// Бинарные операции также обязаны возвращать значения!

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==par2.x && par1.y==par2.y)

return true;

else

return false;

}

public static bool operator != (myPoint2D par1, myPoint2D par2)

{

if (par1.x!=par2.x || par1.y!=par2.y)

return true;

else

return false;

}

true и false Operator

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

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

Point2D p1 = new Point2D(GetVal(), GetVal());

::::::::::

// Это всё равно логическое выражение!

if (p1.x == 125) {/*…*/}

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

Хотя бы так:

// Критерий истинности объекта зависит от разработчика.

// Если значение выражения в скобках примет значение true,

// то пчела окажется правильной!

if (p1) {/*…*/}

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

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

Если в классе была определена операция true, необходимо там же определить операцию false.

// Перегрузка булевских операторов. Это ПАРНЫЕ операторы.

// Объекты типа Point2D приобретают способность судить о правде и лжи!

// А что есть истина? Критерии ИСТИННОСТИ (не путать с истиной)

// могут быть самые разные.

public static bool operator true (Point2D par)

{

if (par.x == 1.0F && par.y == 1.0F) return true;

else return false;

}

public static bool operator false (Point2D par)

{

if (par.x == 0.0F && par.y == 0.0F) return false;

else return true;

}