实现接口如何为我们提供强类型 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?

我可能在这本书的上下文中遗漏了一些东西。我认为接口通过多态性为我们提供了代码重用。 我也明白它们适合编程为抽象而不是具体类型。 这就是我所知道的。

实现接口如何为我们提供强类型 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.ObjectSystem.Object Equals 方法。

我认为Jon说"强类型"指的是泛型。

我没有找到非通用的IEquitable界面,但IComparable<T> vs. IComparable存在。

为了公平起见Skeet(尽管确定他很快就会加入),他确实花时间讨论了第2.2.1节中的"强类型"的含义。

在您的问题的上下文中(我的版本第 85 页)),我认为他的意思是默认的 Equals 方法(将对象作为参数)遵循实现接口的强类型 Equals 方法。