Đây là một ví dụ về những gì Tôi đang cố gắng để làm:Làm thế nào tôi có thể cải thiện mã này: Thừa kế và IEquatable <>
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
Type type1 = this.GetType();
Type type2 = other.GetType();
if (type1 != type2)
return false;
if (type1 == typeof(A))
{
A a = (A)this;
A b = (A)other;
return a.Equals(b);
}
else if (type1 == typeof(B))
{
B c = (B)this;
B d = (B)other;
return c.Equals(d);
}
else
{
throw new Exception("Something is wrong");
}
}
}
public class A : Foo, IEquatable<A>
{
public int Number1 { get; set; }
public int Number2 { get; set; }
public bool Equals(A other)
{
return this.Number1 == other.Number1 && this.Number2 == other.Number2;
}
}
public class B : Foo, IEquatable<B>
{
public int Number1 { get; set; }
public int Number2 { get; set; }
public int Number3 { get; set; }
public bool Equals(B other)
{
return this.Number1 == other.Number1 && this.Number2 == other.Number2 && this.Number3 == other.Number3;
}
}
Nhưng như bạn thấy ở trên, tôi sẽ phải sử dụng nhiều điều kiện 'if' để xác định loại thực. Vấn đề là tôi phải sử dụng lớp cơ sở. Ví dụ:
A a = new A();
Foo foo = a;
foo.Equals(another);
Tại sao bạn cần 'IEquatable' ngay từ đầu? Nó không thêm bất kỳ giá trị nào ở đây. Chỉ cần đảm bảo các kiểu con (hợp lý) ghi đè lên 'object.GetHashCode' và' object.Equals (object) ', ngoài việc thực hiện' IEquatable 'hiện có. Sau đó, bạn nhận được công văn phương pháp ảo miễn phí, và nó sẽ làm việc trong nhiều tình huống hơn. –
Ani
@Ani Bạn sẽ cho tôi xem một ví dụ? –
Hmm. Những lớp học này có vẻ kỳ lạ. Mục đích của Foo là gì vì nó không có tài sản? Ngoài ra nếu B chỉ là một với một số nhiều lý do tại sao không B kế thừa từ A và chỉ cần thêm Number3 thay vì từ Foo? – alun