Dart 自定义运算符

263 阅读1分钟

在 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 中的面向对象编程能力。