ドメイン クラスT
のタイプは次のValueObject<T>
とおりです。
public class Coordinate: ValueObject<Coordinate>
{ ... }
ValueObject<T>
インターフェイスを実装しIEquatable
ます。ValueObject<T>
の具体的な実装ごとに の実装を提供したいbool Equals(T obj)
ので、抽象メソッドとして作成しました。
public abstract class ValueObject<T> : IEquatable<T>
{
public abstract bool Equals(T obj);
public static bool operator ==(ValueObject<T> obj1, ValueObject<T> obj2)
{
if (object.ReferenceEquals(obj1, obj2)) return true;
if (object.ReferenceEquals(obj1, null)) return false;
if (object.ReferenceEquals(obj2, null)) return false;
return obj1.Equals(obj2);
}
}
Coordinate
クラスの Equals 実装:
public class Coordinate : ValueObject<Coordinate>
{
// ...
public override bool Equals(Coordinate other)
{
return (other != null) && (this.Latitude == other.Latitude) && (this.Longitude == other.Longitude);
}
}
ValueObject<T>
== (および、上には示されていない !=) の一般的な操作のオーバーライドを提供します。これは、すべての具体的な実装に適用されます。
問題は、メソッドが == オーバーライドから呼び出されたときに、 ではなくEquals
を呼び出すことです。Object.Equals()
Coordinate.Equals()