我在这里阅读了这个问题,这使我在这里找到了这篇文章。
我有一个抽象基类,它允许我限制方法只接受扩展我的抽象基类(基本多态性)的类。我的问题是:我可以GetHashCode()
在我的抽象基类中实现为任何具体实现提供合适的覆盖吗?(即避免GetHashCode()
在每个具体类中覆盖。)
我在我的抽象基类中想象一个方法是这样的:
public abstract class FooBase
{
private static readonly int prime_seed = 13;
private static readonly int prime_factor = 7;
public override int GetHashCode()
{
// Seed using the hashcode for this concrete class' Type so
// two classes with the same properties return different hashes.
int hash = prime_seed * this.GetType().GetHashCode();
// Get this concrete class' public properties.
var props = this.GetType().GetProperties(BindingFlags.Public);
foreach (var prop in props)
{
// Factor in each of this concrete class' public properties' hashcodes.
hash = (hash * prime_factor) + prop.GetHashCode();
}
return hash;
}
}
这似乎适用于一些基本的平等单元测试,但我觉得我忽略了一些东西。我仍然必须在每个具体类中提供覆盖以避免编译器警告不要覆盖 GetHashCode(),但至少这样我不必为每个类手动编写实现。