实现接口如何为我们提供强类型 API
本文关键字:强类型 API 我们 接口 实现 | 更新日期: 2023-09-27 18:33:07
在深入的C#中,Jon Skeet使用IEquatable<>
来覆盖重载Equals()
操作。
public sealed class Pair<T1, T2> : IEquatable<Pair<T1, T2>>
{
public bool Equals(Pair<T1, T2> other)
{
//...
}
}
他说,我们这样做是为了"提供一个强类型的API,以避免不必要的执行时间检查"。
避免了哪些执行时间检查? 更重要的是,实现接口如何实现强类型 API?
我可能在这本书的上下文中遗漏了一些东西。我认为接口通过多态性为我们提供了代码重用。 我也明白它们适合编程为抽象而不是具体类型。 这就是我所知道的。
Equals
方法采用object
作为参数。因此,在实现此方法时,必须在代码中进行运行时检查,以确保此对象属于 Pair
类型(然后才能比较这两个对象):
public override bool Equals(Object obj) {
// runtime type check here
var otherPair = obj as Pair<T1, T2>;
if (otherPair == null)
return false;
// comparison code here
...
}
然而,IEquatable<T>
的Equals
方法将Pair<T1,T2>
作为类型参数。因此,您可以避免在实现中进行检查,使其更高效:
public bool Equals(Pair<T1, T2> other)
{
// comparison code here
...
}
诸如 Dictionary<TKey, TValue>
、List<T>
和 LinkedList<T>
之类的类足够聪明,可以在其元素上使用IEquatable<T>.Equals
而不是object.Equals
(如果可用)(请参阅 MSDN)。
在本例中,他提供了 Object.Equals
的强类型版本,它将替换可能如下所示的代码:
public override bool Equals(object other)
{
// The following type check is not needed with IEquatable<Pair<T1, T2>>
Pair<T1, T2> pair = other as Pair<T1, T2>;
if (pair != null)
{
// <-- IEquatable<Pair<T1, T2>> implementation
}
else
{
return base.Equals(other);
}
}
IEquatable<T>
接口提供 Equals
方法的强类型实现,而不是接收System.Object
的 System.Object
Equals
方法。
我认为Jon说"强类型"指的是泛型。
我没有找到非通用的IEquitable
界面,但IComparable<T>
vs. IComparable
存在。
为了公平起见Skeet(尽管确定他很快就会加入),他确实花时间讨论了第2.2.1节中的"强类型"的含义。
在您的问题的上下文中(我的版本第 85 页)),我认为他的意思是默认的 Equals 方法(将对象作为参数)遵循实现接口的强类型 Equals 方法。