ما الفرق بين واجهات غير صادقة وغير قابلة للتطبيق؟
-
18-09-2019 - |
سؤال
يبدو أن الواجهات تقارن كائنات المساواة، فما هي الاختلافات الرئيسية بينهما؟
المحلول
IEquatable
اختبارات ما إذا كانت كائنين متساوية.
IComparable
يفرض الطلب الكلي على الكائنات التي تتم مقارنتها.
علي سبيل المثال، IEquatable
سيخبرك أن 5 لا يساوي 7. IComparable
سيخبرك أن 5 يأتي قبل 7.
نصائح أخرى
IEquatable<T>
للمساواة.
IComparable<T>
للطلب.
بالإضافة إلى إجابة greg d's:
قد تنطبق بدون تنفيذه غير قابلة للتطبيق للحصول على فئة حيث منطقية ترتيب جزئي، وأين تتمنى للغاية أن يرسم المستهلك الاستدلال الذي لمجرد إرجاع المقارنة () صفر، هذا لا يعني أن الكائنات متساوية (لأي شيء آخر غير أغراض الفرز).
كما ذكر على صفحة MSDN للحصول على Iequatable:
واجهة المعرفة تحدد
CompareTo
الطريقة، التي تحدد ترتيب الفرز من مثيلات نوع التنفيذ. واجهة Iequatable تحددEquals
الطريقة، التي تحدد مساواة حالات نوع التنفيذ.
Equals
ضد. CompareTo
IComparable <T>
يحدد طريقة مقارنة نوع معين يمكن استخدامها لطلب أو فرز الكائنات.
IEquatable <T>
يعرف الطريقة المعممة التي يمكن استخدامها لتنفيذها لتحديد المساواة.
دعنا نقول أن لديك شخصية شخص
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };
List<Person> people = new List<Person> { p1, p2, p3, p4 };
لفرز هذه الكائنات التي يمكنك استخدامها people.Sort();
.
ولكن هذا سوف ألقيت استثناء.
الإطار لا يعرف كيفية فرز هذه الكائنات. تحتاج إلى معرفة كيفية فرز التنفيذ IComparable
واجهه المستخدم.
public class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson == null)
{
throw new ArgumentNullException();
}
else
{
return Age.CompareTo(otherPerson.Age);
}
}
}
هذا سوف فرز الصفيف بشكل صحيح مع Sort()
طريقة.
التالي لمقارنة كائنين يمكنك استخدامه Equals()
طريقة.
var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
هذا سيعود false
لأن Equals
الطريقة لا تعرف كيفية مقارنة كائنين. لذلك تحتاج إلى تنفيذ IEquatable
واجهة وأخبر الإطار كيفية القيام بالمقارنة. التمديد على المثال السابق سوف تبدو مثل هذا.
public class Person : IComparable, IEquatable<Person>
{
//Some code hidden
public bool Equals(Person other)
{
if (Age == other.Age && Name == other.Name)
{
return true;
}
else
{
return false;
}
}
}