В скриптах поддерживается перегрузка операторов, то есть изменение действий, связанных с такими операциями, как сложение, вычитание, умножение и так далее.
Перегрузка операторов возможна только для объектов конкретного класса и делается это при помощи переопределения методов с предопределёнными именами.
Например, в следующем примере для класса gun переопределяется метод opAddAssign, который соответствует оператору += (сложение с присваиванием).
После этого становится возможным прибавлять к gun целое число (в игре такое действие может соответствовать перезарядке оружия):
class gun
Обсуждение того, в каких случаях следует, а в каких не следует использовать механизм перегрузки операторов, не является предметом данной статьи, поэтому ограничимся лишь перечислением доступных для переопределения методов.
{
int ammo = 0;
void opAddAssign (int count)
{
ammo+=count;
}
}
void main ()
{
gun shotgun;
// Добавили десять патронов.
shotgun += 10;
}
Методы, собранные в следующую таблицу, соответствуют унарным операторам.
Эти методы не принимают параметров, а воздействуют на сам объект.
Для наглядности в скобках указаны операции, которые эти операторы реализуют для целых чисел.
Имя метода | Оператор |
opNeg | — (унарный минус ) |
opCom | ~ (инверсия) |
opPreInc | ++ (префиксный инкремент) |
opPreDec | — (префиксный инкремент) |
opPostInc | ++ (постфиксный инкремент) |
opPostDec | — (постфиксный декремент) |
Бинарные операторы требуют двух операндов, но данные методы получают лишь один параметр (это правый операнд), левым операндом является сам объект (в методах с суффиксом _r ситуация обратная — левый операнд передаётся в качестве параметра, а правым является сам объект).
Имя метода | Оператор |
opAdd и opAdd_r | + |
opSub и opSub_r | — |
opMul и opMul_r | * |
opDiv и opDiv_r | / |
opMod и opMod_r | % |
opAnd и opAnd_r | & |
opOr и opOr_r | | |
opXor и opXor_r | ^ |
opShl и opShl_r | << |
opShr и opShr_r | >> |
opUshr и opUshr_r | >>> |
Имя метода | Оператор |
opAssign | = (присвоить значение) |
opAddAssign | += |
opSubAssign | -= |
opMulAssign | *= |
opDivAssign | /= |
opModAssign | %= |
opAndAssign | &= |
opOrAssign | |= |
opXorAssign | ^= |
opShlAssign | <<= |
opShrAssign | >>= |
opUshrAssign | >>>= |
Чтобы перегрузить оператор индексирования, необходимо определить метод opIndex.
Этот метод получает индекс элемента в качестве единственного параметра и должен вернуть значение, соответствующее этому индексу.
Пример перегрузки оператора индексирования для класса vector:
class vector
{
double x,y,z;
// ...
double& opIndex(int i)
{
if(i==0)
{
return x;
}
else if(i==1)
{
return y;
}
else if(i==2)
{
return z;
}
}
}
В этом примере метод возвращает не просто значение, а ссылку на соответствующую координату вектора.Это позволяет использовать оператор индексирования для присваивания нового значения соответствующей координате:
vector v;
v[1] = 42;
Для того чтобы перегрузить операторы эквивалентности (== и !=), необходимо определить один метод с именем opEquals.Метод должен принимать один параметр, который является вторым операндом, и возвращать значение типа bool.
Например:
class commando
{
string callsign;
// ...
bool opEquals (commando@ other) const
{
return this.callsign==other.callsign;
}
}
// Где-нибудь в коде...
if (commando1 != commando2)
{
// Делаем что-нибудь...
}
Для того чтобы перегрузить операторы сравнения (<, <=, > и >=), необходимо определить один метод с именем opCmp.Этот метод должен принимать один параметр, который является вторым операндом, и возвращать значение типа int в соответствии со следующими правилами:
- Вернуть 0, если первый и второй операнды совпадают.
- Вернуть отрицательное число, если первый операнд меньше второго.
- Вернуть положительное число, если первый операнд больше второго.