繁体   English   中英

在覆盖运算符时,Dart 中的 super 和 this 有什么区别?

[英]What's the difference between super and this in Dart while overriding an operator?

最小的可重现代码:

void main() {
  const one = Foo();
  const two = Foo();
  print(one == two);
}

class Foo {
  const Foo();

  @override
  bool operator ==(Object other) {
    assert(super == this); // Works (Line - 1)
    return this == other; // Error (Line - 2)
    // return super == other; // Works 
  }
}

断言有效(Line - 1) ,但(Line - 2)失败并出现以下错误。 但是,也return super == other作品。

未捕获的 RangeError:超出了最大调用堆栈大小错误:RangeError:超出了最大调用堆栈大小

首先,第 1 行有效,因为您使用的是Object class 中的 == 运算符,它根据 object 的地址确定相等性。

在第 2 行,您遇到堆栈溢出(错误,而不是本网站),因为当您测试相等性时,将调用==运算符,但是当执行到达“第 2 行”时,您再次调用==运算符导致对==方法的递归调用。 这会导致一个无限循环,用对==的调用填充您的调用堆栈,直到它溢出导致您遇到错误。

重载运算符时, superthis没有特殊含义。 它们的含义与往常一样。 this是指当前的 object。 super是指父 object。 (请记住,如果没有指定,所有对象都有一个隐含的超类Object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM