Ключевое слово operator
Ключевое слово operator используется внутри класса для переопределения поведения стандартных операторов языка Dart. Это позволяет объектам класса участвовать в выражениях с операторами (например, +, -, ==, [] и другими). В качестве имени метода выступает сам оператор. В параметры метода передается правый операнд (для бинарных операторов) или индекс (для оператора []). Переопределение операторов делает код более выразительным и интуитивно понятным при работе с пользовательскими типами данных.
Синтаксис
class ClassName
{
ReturnType operator +(Type other)
{
// implementation
}
}
Пример
Давайте создадим класс Vector, представляющий двумерный вектор, и переопределим оператор + для сложения векторов:
class Vector
{
final int x;
final int y;
Vector(this.x, this.y);
Vector operator +(Vector other)
{
return Vector(this.x + other.x, this.y + other.y);
}
@override
String toString()
{
return '($x, $y)';
}
}
void main()
{
Vector v1 = Vector(1, 2);
Vector v2 = Vector(3, 4);
Vector res = v1 + v2;
print(res);
}
Результат выполнения кода:
"(4, 6)"
Пример
Давайте переопределим оператор [] для доступа к элементам пользовательской коллекции:
class MyList
{
final List<int> _items;
MyList(this._items);
int operator [](int index)
{
return _items[index] * 10;
}
}
void main()
{
MyList list = MyList([1, 2, 3, 4, 5]);
print(list[2]);
}
Результат выполнения кода:
30
Пример
Давайте переопределим оператор == для сравнения объектов по значению:
class Point
{
final int x;
final int y;
Point(this.x, this.y);
@override
bool operator ==(Object other)
{
if (other is! Point) return false;
return this.x == other.x && this.y == other.y;
}
@override
int get hashCode => Object.hash(x, y);
}
void main()
{
Point p1 = Point(1, 2);
Point p2 = Point(1, 2);
print(p1 == p2);
}
Результат выполнения кода:
true