22

Dart は関数のオーバーロードをサポートしていないことを読みました。演算子のオーバーロードをサポートしていますか? はいの場合、簡単な例でどのように行われるかを教えていただけますか? また、メリットなどはありますか?

4

5 に答える 5

23

Dart は、operatorキーワードの後に​​オーバーロードする演算子を使用した演算子のオーバーロードをサポートしています。次の例では、 MyClassオブジェクトの==演算子をオーバーロードします。

class MyClass {
  operator ==(MyClass other) {
    // compare this to other
  }
}

代入演算子= と参照等価演算子=== (もう存在しません)を除いて、ほとんどすべての Darts 組み込み演算子はオーバーロードできます。

演算子のオーバーロードの利点として、オブジェクトの操作に==+などのよく知られたセマンティックな意味を持つ演算子を再利用できます。たとえば、+演算子をオーバーロードする Matrix クラスがある場合、より面倒なm1.plus(m2)の代わりに、構文m1 + m2を使用して 2 つの行列を追加できます。

于 2012-04-12T19:56:27.627 に答える
6

演算子のオーバーロードの使用方法を学習する素晴らしい例は、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})';
  }
}
于 2019-07-10T19:01:45.623 に答える