Dart – это мощный язык программирования, поддерживающий перегрузку операторов, позволяющий разработчикам переопределить поведение таких операторов, как +, -, *, / и других. Эта функция позволяет вам настроить работу ваших классов с операторами, обеспечивая гибкость и выразительность вашего кода. В этой статье мы углубимся в различные методы перегрузки операторов в Dart, сопровождая их примерами кода, чтобы помочь вам раскрыть весь потенциал этой возможности языка.
- Арифметические операторы:
Dart позволяет перегружать арифметические операторы, такие как +, -, *, /, % и ~/, для выполнения пользовательских операций над объектами ваших классов. Вот пример:
class Vector {
double x, y;
Vector(this.x, this.y);
Vector operator +(Vector other) {
return Vector(x + other.x, y + other.y);
}
}
void main() {
var v1 = Vector(2, 3);
var v2 = Vector(4, 5);
var sum = v1 + v2;
print('Sum: ${sum.x}, ${sum.y}'); // Output: Sum: 6, 8
}
- Операторы равенства и сравнения.
Вы также можете перегрузить операторы равенства (==, !=) и сравнения (<, >, <=, >=), чтобы определить собственное поведение для сравнения объектов. Вот пример:
class Person {
String name;
int age;
Person(this.name, this.age);
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Person && name == other.name && age == other.age;
}
int get hashCode => name.hashCode ^ age.hashCode;
}
void main() {
var p1 = Person('John', 30);
var p2 = Person('John', 30);
print(p1 == p2); // Output: true
}
- Оператор индексирования:
Оператор индексирования ([]) можно перегрузить, чтобы обеспечить индивидуальный доступ к объектам на основе индекса. Вот пример:
class Matrix {
List<List<int>> data;
Matrix(this.data);
List<int> operator [](int index) {
return data[index];
}
}
void main() {
var matrix = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
print(matrix[1]); // Output: [4, 5, 6]
}
- Унарные операторы:
Унарные операторы, такие как – (отрицание) и ! (логическое отрицание) можно перегрузить для определения пользовательского поведения. Вот пример:
class Complex {
double real, imaginary;
Complex(this.real, this.imaginary);
Complex operator -() {
return Complex(-real, -imaginary);
}
}
void main() {
var c = Complex(2, 3);
var negated = -c;
print('Negated: ${negated.real}, ${negated.imaginary}'); // Output: Negated: -2, -3
}
Перегрузка операторов в Dart позволяет разработчикам переопределять поведение операторов для своих пользовательских классов, обеспечивая выразительный и лаконичный код. В этой статье мы исследовали различные методы перегрузки операторов, включая арифметические операторы, операторы равенства и сравнения, оператор индексации и унарные операторы. Используя эти методы, вы можете создавать более интуитивно понятные и мощные абстракции в своих программах Dart.