为什么要在这里@覆盖 "get"?(Dart中的语法)

问题描述 投票:0回答:1

这个 Flutter官方的例子有一个类,它没有扩展另一个类。那么为什么 int get hashCode@override 凌驾于它之上?即没有什么可以覆盖的,不是吗?

class Item {
  final int id;
  final String name;
  final Color color;
  final int price = 42;

  Item(this.id, this.name)
      // To make the sample app look nicer, each item is given one of the
      // Material Design primary colors.
      : color = Colors.primaries[id % Colors.primaries.length];

  @override
  int get hashCode => id;

  @override
  bool operator ==(Object other) => other is Item && other.id == id;
}
dart
1个回答
4
投票

哈希码属性文档:

所有对象都有哈希码。默认的哈希码只代表对象的身份,就像默认的运算符==的实现一样,只有当对象相同时,才会认为它们是相等的(见 identityHashCode)。

而从 对象类文档

因为Object是Dart类层次结构的根,所以每一个其他的Dart类都是Object的子类。

每个类都是Object的子类。Object class因此,它们将始终具有相同的属性,这就是你要覆盖的东西。

现在,如果你问为什么要覆盖这两个 hashCodeequals,检查 这个环节


2
投票

来自官方 文件

哈希码是一个单一的整数,它表示对象的状态,影响运算符==比较。所有对象都有哈希码。默认的哈希码只代表对象的身份,就像默认的运算符==实现只有在对象相同的情况下才认为对象相等一样(参见 identityHashCode)。

换句话说,每当你创建一个Item类的对象时,你也会为它生成一个hashCode属性。

因此,现在如果你想检查两个 item 类对象的平等性,Dart(像 Java)将通过以下操作来检查其平等性。== 的哈希码。

这意味着 Item object1 != Item Object2 因为每个对象都有自己独特的哈希码。

因此,哈希码必须被覆盖,在这种情况下,所以 Item object1 可以检查是否与 Item object2

© www.soinside.com 2019 - 2024. All rights reserved.