Я читал, что Dart не поддерживает перегрузку функции. Поддерживает ли он перегрузку оператора. Если да, было бы мило и показать мне, как на простом примере, как это делается. И каковы некоторые преимущества и т.д. Я новичок в программировании. Благодарю.
Поддерживает ли дротик поддержку перегрузки оператора
Ответ 1
Выбранный ответ больше не действителен, когда вы пытаетесь перегрузить оператор == в новой версии. Теперь вам нужно сделать так:
class MyClass {
@override
bool operator ==(other) {
// compare this to other
}
}
Но это не безопасно. other
не указан как тип, может произойти что-то неожиданное. Например:
void main() {
var a = A(1);
var b = B(1);
var result = a == b;
print(result); //result is true
}
class A {
A(this.index);
final int index;
@override
bool operator ==(other) => other.index == index;
}
class B {
B(this.index);
final int index;
}
Итак, вы делаете облако следующим образом:
class A {
A(this.index);
final int index;
@override
bool operator ==(covariant A other) => other.index == index;
}
Вам нужно использовать covariant
Потому что объект перегружает оператор ==.
Ответ 2
Да Dart поддерживает перегрузку оператора с помощью ключевого слова оператора, за которым следует оператор, который вы хотите перегрузить. Следующий пример перегружает оператор == для объекта MyClass:
class MyClass {
operator ==(MyClass other) {
// compare this to other
}
}
почти все встроенные операторы Дартса могут быть перегружены несколькими заметными исключениями, являющимися оператором присваивания = и оператором ссылочной эквивалентности === (больше не существует).
Что касается преимущества перегрузки оператора, это позволяет повторно использовать операторы, которые имеют хорошо известные семантические значения, такие как == или + для операций над вашими объектами. Например, если у вас есть класс Matrix, который перегружает оператор +, вы можете добавить две матрицы, используя синтаксис m1 + m2, а не более громоздкий m1.plus(м2)
Ответ 3
Чтобы продлить ответ Ларса, вы также можете перегрузить операторы, используя синтаксис встроенной функции.
class MyClass {
operator ==(MyClass o) => id == o.id;
}
Ответ 4
Удивительный пример изучения перегрузки операторов - это класс для обработки комплексных чисел в dart:
import 'dart:core';
class Complex {
final double real;
final double imaginary;
Complex({this.real = 0, this.imaginary = 0});
Complex.ri(this.real, this.imaginary);
Complex operator +(Complex b) {
return Complex(
real: this.real + b.real, imaginary: this.imaginary + b.imaginary);
}
Complex operator -(Complex b) {
return Complex(
real: this.real - b.real, imaginary: this.imaginary - b.imaginary);
}
Complex operator *(Complex b) {
return Complex(
real: this.real * b.real - this.imaginary * b.imaginary,
imaginary: this.real * b.imaginary + this.imaginary * b.real);
}
Complex operator /(Complex b) {
// https://stackoverflow.com/a/41146661/6846888
var conjugation = b.conjugate();
var denominatorRes = b * conjugation;
// denominator has only real part
var denominator = denominatorRes.real;
var nominator = this * conjugation;
return Complex(
real: nominator.real / denominator,
imaginary: nominator.imaginary / denominator);
}
bool operator ==(b) {
return b.real == this.real && b.imaginary == this.imaginary;
}
@override
String toString() {
return 'Complex(real: ${real}, imaginary: ${imaginary})';
}
}