[英]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.