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