Руководство пользователя

Перегрузка операторов
NetTradeX PC
NetTradeX Android
NetTradeX iOS
NetTradeX Mobile
NetTradeX Advisors
Перегрузка операторов

В языке 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