重载运算符作为Dart一个重要特征,初学者可能很难理解,加之Flutter本身作为一种全新的开发方式,网上的学习资料甚少。
笔者作为一名安卓开发工程师在学习Dart的时候也遇到了重载运算符的问题,第一次看感觉很难理解。
其实翻看Dart语言的手册不难发现,Dart本身也是充分吸收了各个开发语言所长,在重载运算符这块,和C++有着极其相似的地方。
先上一段实验代码:
//dart实验代码
void main() {
var man1 = new man(1, 2);
var man2 = new man(3, 4);
(man1 - man2).printM();
(man1 + man2).printM();
}
class man {
int a;
int b;
man(this.a, this.b);
man operator +(man v){//这其中,左边的man作为返回类型,可写可不写
return new man(a + v.a, b);
}
man operator -(man v){//operator作为重载运算符的标志,必须写上,后面跟一个需要重载的运算符
return new man(a - v.a, b);
}
printM(){
print("a: $a, b :$b");
}
}
通过代码可以看出在main函数中首先创建了两个man对象,在man类中,重新定义了“+”,“-”运算符,这其中,operator关键字必须写上,运算符后面的括号中代表的是传入的参数类型和形参。
在方法体中,return也是必要的,后面跟着需要返回的对象或类型。
其实通过参考C++的重载运算符不难发现,不论是Dart还是C++,我们在学习时候可以把它理解为本质是一种函数调用,只不过是一种加了operator关键字的函数,后面的运算符也就是我们需要被重载的运算符,在函数调用的过程中使用运算符调用了相关函数。
这样做的好处就是我们可以做一些传统意义上运算符做不了的操作,就像上面这段代码例子中的man1和man2进行加减操作一样,在类似于Java这样的语言中,肯定是不允许两个对象直接做加减运算的,但是Dart的重载运算符特性可以让我们重新定义运算符的一些计算规则。
相信你看了以上的介绍一定对Dart的重载运算符有了一定的了解,但凡是都有例外,Dart中限定了一些可以被重载的运算符,这里贴一个Flutter官网关于Dart重载运算符的规定吧:
Overridable operators(可覆写的操作符)
下表中的操作符可以被覆写。 例如,如果你定义了一个 Vector 类, 你可以定义一个 +
函数来实现两个向量相加。
< |
+ |
| |
[] |
> |
/ |
^ |
[]= |
<= |
~/ |
& |
~ |
>= |
* |
<< |
== |
– |
% |
>> |