Поддерживает ли дротик поддержку перегрузки оператора

Я читал, что 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})';
  }
}