运算符重载不能与颤振中的操作数互换

Operator overloading not interchangeable with operands in flutter

提问人:intweek 提问时间:10/14/2023 更新时间:10/14/2023 访问量:43

问:

我正在 flutter 中制作一个自定义数字类,并想在类和普通整数和双精度之间进行基本算术运算。因此,我在类定义中重载了乘法运算符并尝试使用它。示例(不是实际的类,而是类的实现重要:

class MyClass {
  double value;

  MyClass(this.value);

  MyClass operator *(dynamic other) {
    if (other is num) {
      return MyClass(this.value * other);
    }
    throw ArgumentError("Unsupported operation");
  }
}

void main() {
  MyClass myObject = MyClass(5.0);

  MyClass result1 = myObject * 2;
  MyClass result2 = 2 * myObject;

  print(result1.value); // Expected output: 10.0
  print(result2.value); // Expected output: 10.0
}

但是在第二种情况()中发生的情况是我得到一个错误,因为你不能添加到,而你可以添加到。2 * myObjectMyClassnumnumMyClass

有没有办法使操作员过载,以便实现第二种情况?(例如,在 C++ 中,您可以)

Flutter Dart 运算符重载

评论

0赞 Randal Schwartz 10/14/2023
Smalltalk 也有同样的局限性,在核心数学类中通过使用 double-dispatch 解决了这个问题,但即使 Dart 的对象模型部分来自 Smalltalk,除了在 Json 解析中之外,double dispatch 似乎并没有太多使用。
0赞 intweek 10/14/2023
@RandalSchwartz,这是否意味着我根本做不到?
1赞 jamesdlin 10/14/2023
这在 Dart 中是不可能的。Dart 不支持重载,因此不可能让现有的运算符接受你类型的参数。您可以添加自己的扩展,以便您这样做并且两者都有效,但 IMO 最好只使用参数并强制调用者首先将值包装起来。numnum2.multiply(myObject)myObject.multiply(2)MyClass.operator*MyClassnumMyClass

答:

-1赞 arshia_sir 10/14/2023 #1

是的,可以使操作员过载,以便实现第二种情况。您可以定义一个新运算符,该运算符将 num 作为其左操作数,将 MyClass 对象作为其右操作数。下面是一个示例实现:

class MyClass {
  double value;

  MyClass(this.value);

  MyClass operator *(dynamic other) {
    if (other is num) {
      return MyClass(this.value * other);
    }
    throw ArgumentError("Unsupported operation");
  }

  MyClass operator +(num other) {
    return MyClass(this.value + other);
  }
}

void main() {
  MyClass myObject = MyClass(5.0);

  MyClass result1 = myObject * 2;
  MyClass result2 = 2 + myObject;

  print(result1.value); // Expected output: 10.0
  print(result2.value); // Expected output: 7.0
}

在此实现中,我们定义了一个新的运算符,该运算符将 num 作为其左操作数,将 MyClass 对象作为其右操作数。该实现只是将 num 添加到 MyClass 对象的值中,并返回一个新的 MyClass 对象和结果。+

请注意,您可以以类似的方式定义其他运算符以支持其他算术运算。

评论

1赞 intweek 10/15/2023
这是不正确的。它不起作用,因为您仍然将构造函数定义为 + 而不是 + 。您是否尝试运行此代码,因为我收到错误:MyClassnumnumMyClassError: A value of type 'MyClass' can't be assigned to a variable of type 'num'. - 'MyClass' is from 'package:dartpad_sample/main.dart' ('lib/main.dart'). MyClass result2 = 2 + myObject;