img

Перегрузка операторов

В языке NetTradex имеется возможность перегрузки операторов. Таким образом программист может сам определить, как будет функционировать тот или иной оператор, применяемый к экземплярам объектов пользовательского класса. Для осуществления перегрузки оператора необходимо описать метод, имеющий одно из указанных ниже имен, этот метод будет автоматически вызываться при применении соответствующего оператора.

Операции и их эквивалентные методы

Эквивалентные методы для унарных префиксных операторов

ОператорМетод
-opNeg
~opCom
++opPreInc
–- opPreDec

Эквивалентные методы для унарных постфиксных операторов

ОператорМетод
++opPostInc
–-opPostDec

Эквивалентные методы для операторов сравнения

ОператорМетод
==opEquals
!=opEquals1
<opCmp
<=opCmp2
>opCmp2
>=opCmp2

1Для операций == и != используется единый метод opEquals, который должен возвращать переменную типа bool. Операция != обрабатывается аналогичным образом, только возвращаемый результат будет обратным.

2Для операций <,<=,>,>= используется единый метод opCmp, который должен возвращать переменную типа int. Если объект передаваемый, как аргумент метода считается больше экземпляра объекта, у которого вызывается этот метод, функция должна возвращать отрицательное значение, если они равны между собой - возвращать 0.

Эквивалентные методы для операторов присваивания

ОператорФункция
=opAssign
+=opAddAssign
-=opSubAssign
*=opMulAssign
/=opDivAssign
%=opModAssign
&=opAndAssign
|=opOrAssign
^=opXorAssign
<<=opShlAssign
>>=opShrAssign
>>>=opShrAssign

Эквивалентные методы для бинарных операторов

ОператорФункция
+opAdd
-opSub
*opMul
/opDiv
%opMod
&opAnd
|opOr
^=opXor
<<opShl
>>opShr
>>>opUShr

Перегрузим постфиксный оператор ++ и бинарный +

 class A { int a; int b; // Конструкторы A() { } A(int a, int b) { this.a = a; this.b = b; } // Операция ++ A@ opPostInc() { a++; b++; return this; } // Операция + A@ opAdd(const A &in other) { A obj; obj.a = this.a + other.a; obj.b = this.b + other.b; return obj; } void Print() { System.Print("a="+a+" b="+b); } } int Run() { A x(5,10); x++; x.Print(); A y(7,11); A w(3,4); A s; s = y + w; s.Print(); return 0; } 

Оператор индексирования

ОператорФункция
[]opIndex

Для получения доступа к элементам объекта пользовательского класса, функция должна быть названа get_opIndex с единственным параметром - номером элемента. Для изменения значения элемента должен быть реализован метод set_opIndex с двумя параметрами: номер элемента и значение параметра.

Пример использования оператора [] для пользовательского класса.

 class MyArray { // Массив, где мы будем хранить значения array <float> x; // Получение значения элемента по индексу float get_opIndex(uint idx) { // Если элемента с таким номером нет или получен отрицательный номер if((idx > x.length-1) || (idx < 0)) { return 0; } return x[idx]; } // Установка значения элемента void set_opIndex(uint idx, float value) { // При отрицательном индексе сразу выходим if(idx<0)return; // Если элемента с таким индексом нет if(idx>=x.length) { for(uint i=x.length; i<idx; i++) { x.insertLast(0); } x.insertLast(value); } // Если элемент есть else { x[idx]=value; } } // Вывод содержания массива void Print() { string output; for(uint i=0;i<x.length;i++) { output+=" ["+i+"]="+x[i]; } System.Print(output); } } int Run() { MyArray a; a[2]=22; a.Print(); a[4]=44; a.Print(); a[3]=33; a.Print(); return 0; } 

Вывод:

 [0]=0 [1]=0 [2]=22 [0]=0 [1]=0 [2]=22 [3]=0 [4]=44 [0]=0 [1]=0 [2]=22 [3]=33 [4]=44