私はこの質問をここで読んで、この記事をここに導きました。
抽象基本クラス (基本ポリモーフィズム) を拡張するクラスのみを受け入れるようにメソッドを制限できる抽象基本クラスがあります。私の質問は次のとおりです: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() をオーバーライドしないことに関するコンパイラの警告を回避するために、各具体的なクラスでオーバーライドを提供する必要がありますが、少なくともこの方法では、それぞれの実装を手動で記述する必要はありません。