繁体   English   中英

覆盖子类中的 hashCode 和 operator==

[英]Overriding hashCode and operator== in subclasses

假设我在 class 中有此代码:

abstract class ClassA {
  final int a;
  final double b;
  const ClassA(this.a, this.b);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;

    if (other is ClassA) {
      return runtimeType == other.runtimeType &&
          a == other.a &&
          b == other.b;
    } else {
      return false;
    }
  }

  @override
  int get hashCode {
    var result = 17;

    result = 37 * result + a.hashCode;
    result = 37 * result + b.hashCode;

    return result;
  }

}

现在我想像这样创建两个具体的类 B 和 C:

class ClassB extends ClassA {
  ClassB() : super(0, 0.0);
}

class ClassC extends ClassA {
  final int c;
  ClassC(this.c) : super(0, 0.0);
}

当然, ClassB没问题,因为它只是扩展了ClassA而没有引入任何新变量。 但是ClassC呢? 有一个新的 c 参数,所以我应该再次覆盖 hashCode 和 == 吗? 像这样:

class ClassC extends ClassA {
  final int c;
  ClassC(this.c) : super(0, 0.0);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;

    if (other is ClassC) {
      return runtimeType == other.runtimeType &&
          c == other.c &&
          super == other;
    } else {
      return false;
    }
  }

  @override
  int get hashCode {
    var result = 17;

    result = 37 * result + a.hashCode;
    result = 37 * result + super.hashCode;

    return result;
  }
}

请注意在ClassC中我如何添加对 super 的调用。

result = 37 * result + super.hashCode;

需要吗?

是的,需要。 除非两个具有不同 C 值的对象应该被忽略以求相等。 此外,您的 C 的 hashCode 并未使用所有成员,因此它可能会扭曲基于哈希的数据结构。

暂无
暂无

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

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