在 Dart 中,自定义运算符(operator overloading)允许你为类重载一些运算符,使它们可以对类的实例进行运算操作。这样,你可以定义对象之间的加法、减法、乘法等运算方式。
以下是 Dart 中如何自定义运算符的示例:
1. 重载 + 运算符
假设我们有一个 Vector 类,表示二维向量,我们希望能够对两个向量进行加法运算。
class Vector {
final int x;
final int y;
Vector(this.x, this.y);
// 重载 + 运算符
Vector operator +(Vector other) {
return Vector(this.x + other.x, this.y + other.y);
}
@override
String toString() => 'Vector($x, $y)';
}
void main() {
var v1 = Vector(2, 3);
var v2 = Vector(4, 5);
var result = v1 + v2;
print(result); // 输出: Vector(6, 8)
}
在上面的代码中,我们通过 operator + 方法重载了 + 运算符,使得 Vector 类的实例可以进行加法操作。
2. Dart 支持的可重载运算符
Dart 支持重载的运算符包括以下几种:
-
一元运算符:
-(负号)~(按位取反)!(逻辑非)
-
二元运算符:
+(加法)-(减法)*(乘法)/(除法)%(取模)~/(整除)>、<、>=、<=(比较)==(相等)[](索引)^(按位异或)&(按位与)|(按位或)<<、>>(位移)
3. 重载比较运算符
我们还可以重载比较运算符,例如 == 和 >。
class Vector {
final int x;
final int y;
Vector(this.x, this.y);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Vector &&
runtimeType == other.runtimeType &&
x == other.x &&
y == other.y;
@override
int get hashCode => x.hashCode ^ y.hashCode;
bool operator >(Vector other) {
return (this.x > other.x) && (this.y > other.y);
}
@override
String toString() => 'Vector($x, $y)';
}
void main() {
var v1 = Vector(2, 3);
var v2 = Vector(2, 5);
print(v1 == v2); // 输出: false
print(v1 > v2); // 输出: false
}
通过这种方式,我们可以使类的实例支持自定义的运算行为,增强了 Dart 中的面向对象编程能力。