dart是否支持运算符重载?(不要与覆盖混淆)

dart是否支持运算符重载?(不要与覆盖混淆),dart,Dart,这听起来像是: 但是这个名字有误导性,问题是如何覆盖现有的操作符(=操作符) 据我所知,重载一个函数意味着有多个实现,这些实现仅在参数上有所不同,而在函数的名称上则不一样: int max(int a, int b); double max(double a, double b); 相反,重写意味着重写现有的实现。由于替换了原始函数,因此没有名称冲突。这在OOP中很常见,在OOP中扩展基类并重写其方法 该函数表示存在可重写的运算符。因此,我看到您可以实现自定义运算符。同时,dart不支持重载方

这听起来像是:
但是这个名字有误导性,问题是如何覆盖现有的操作符(
=
操作符)

据我所知,重载一个函数意味着有多个实现,这些实现仅在参数上有所不同,而在函数的名称上则不一样:

int max(int a, int b);
double max(double a, double b);
相反,重写意味着重写现有的实现。由于替换了原始函数,因此没有名称冲突。这在OOP中很常见,在OOP中扩展基类并重写其方法

该函数表示存在可重写的运算符。因此,我看到您可以实现自定义运算符。同时,dart不支持重载方法。那么,dart支持重载操作符吗

是否可以编写以下代码:

class Matrix{
  Matrix operator+(int b){//...};
  Matrix operator+(Matrix b({//...};
}

加载dartpad后,dart似乎不支持重载运算符:

class A{
  operator*(int b){
    print("mul int");
  }
  operator*(double b){
    print("mul double");
  }
}
导致错误消息:

Error compiling to JavaScript:
main.dart:5:11:
Error: '*' is already declared in this scope.
  operator*(double b){

加载dartpad后,dart似乎不支持重载运算符:

class A{
  operator*(int b){
    print("mul int");
  }
  operator*(double b){
    print("mul double");
  }
}
导致错误消息:

Error compiling to JavaScript:
main.dart:5:11:
Error: '*' is already declared in this scope.
  operator*(double b){

geometry.dart
中有以下几行:

///一元否定运算符。
///
///返回坐标为负数的偏移量。
///
///如果[Offset]表示平面上的箭头,则此运算符返回
///相同的箭头,但指向相反的方向。
偏移运算符-()=>Offset(-dx,-dy);
经过一些研究,似乎“-”运算符可以与0或1参数一起使用,这允许它被定义两次。
///二进制减法运算符。
///
///返回其[dx]值为左侧操作数[dx]的偏移量
///减去右侧操作数的[dx],其[dy]值为
///左侧操作数的[dy]减去右侧操作数的[dy]。
///
///另见[翻译]。
偏移运算符-(偏移其他)=>Offset(dx-other.dx,dy-other.dy);

这只是因为可以使用0或1个参数定义
-
运算符。

几何体中。dart
有以下几行:

///一元否定运算符。
///
///返回坐标为负数的偏移量。
///
///如果[Offset]表示平面上的箭头,则此运算符返回
///相同的箭头,但指向相反的方向。
偏移运算符-()=>Offset(-dx,-dy);
经过一些研究,似乎“-”运算符可以与0或1参数一起使用,这允许它被定义两次。
///二进制减法运算符。
///
///返回其[dx]值为左侧操作数[dx]的偏移量
///减去右侧操作数的[dx],其[dy]值为
///左侧操作数的[dy]减去右侧操作数的[dy]。
///
///另见[翻译]。
偏移运算符-(偏移其他)=>Offset(dx-other.dx,dy-other.dy);

这只是因为可以使用0或1个参数定义
-
运算符。

是的,您肯定可以这样做,但您需要检查单个方法内的类型,因为一个运算符不能有重复的方法:

class Matrix {
  int num = 0;
  Matrix(this.num);
  Matrix operator+(dynamic b) {
    if(b is int) {
      return Matrix(this.num + b);  
    } else if(b is Matrix){
      return Matrix(this.num + b.num);
    } 
  }
}

void main() {
  print((Matrix(5) + 6).num);  

  print((Matrix(7) + Matrix(3)).num);
}

是的,您当然可以这样做,但是您需要检查单个方法中的类型,因为一个运算符不能有重复的方法:

class Matrix {
  int num = 0;
  Matrix(this.num);
  Matrix operator+(dynamic b) {
    if(b is int) {
      return Matrix(this.num + b);  
    } else if(b is Matrix){
      return Matrix(this.num + b.num);
    } 
  }
}

void main() {
  print((Matrix(5) + 6).num);  

  print((Matrix(7) + Matrix(3)).num);
}

你基本上已经回答了你自己的问题

存在可重写的运算符。因此,我看到您可以实现自定义运算符。同时,dart不支持重载方法。那么,dart支持重载操作符吗

Dart语言规范规定:

10.1.1操作员 运算符是具有特殊名称的实例方法


Dart不支持重载方法(或函数),运算符等同于方法,因此,Dart不支持运算符重载。

您基本上已经回答了自己的问题

存在可重写的运算符。因此,我看到您可以实现自定义运算符。同时,dart不支持重载方法。那么,dart支持重载操作符吗

Dart语言规范规定:

10.1.1操作员 运算符是具有特殊名称的实例方法


Dart不支持重载方法(或函数),运算符等同于方法,因此,Dart不支持运算符重载。

要补充的是,在Dart中创建联合类型的工作正在进行中,这将允许创建一个采用多种类型参数的方法:。这仍然不是方法/运算符重载,但我想说这将是一个很好的解决方法。感谢问题链接。但这并不令人鼓舞,它已经开放了将近8年。我假设这将成为模式匹配/分解支持的一部分。这将是一个巨大的语言变化。目前他们仍在nnbd深处。因此,我打赌至少需要一年时间才能支持联合类型。要补充的是,在Dart中创建联合类型的工作正在进行中,这将允许创建一个接受多种类型参数的方法:。这仍然不是方法/运算符重载,但我想说这将是一个很好的解决方法。感谢问题链接。但这并不令人鼓舞,它已经开放了将近8年。我假设这将成为模式匹配/分解支持的一部分。这将是一个巨大的语言变化。目前他们仍在nnbd深处。所以我敢打赌,至少一年后工会类型才会得到支持。从技术上讲,这不是超载。它仍然只是一个方法定义,里面有一个黑开关。但这对我来说确实很有用,谢谢你的提示。从技术上讲,这不是超载。它仍然只是一个方法定义,里面有一个黑开关。但这对我来说真的很有用,谢谢你的帮助