C#中的接口实现语法选项

时间:2013-06-11 07:21:37

标签: c# .net generics syntax interface

好的,这是一个非常基本的问题,但我刚刚碰到它。考虑以下课程:

public class WindowComparer: IComparer, Generic.IComparer<Window> { }

场景1:我通常会声明它的方式。

public int Compare (object x, object y)
{
    return (this.Compare((Window) x, (Window) y));
}

public int Compare (Window x, Window y) {...}

场景2:MSDN文档通常声明它的方式。

int Collections.IComparer.Compare (object x, object y)
{
    // [this.Compare] is not recognized. How to access this?
    return (this.Compare((Window) x, (Window) y));
}

int Generic.IComparer<Window>.Compare (Window x, Window y) {...}

但是,在尝试方案2时,i​​ntellisense丢失了Compare方法,并且编译器引发了一个错误,指出Compare方法不是WindowComparer的成员。我错过了什么?

4 个答案:

答案 0 :(得分:5)

在第二个场景中,显式实现了接口IComparerIComparer<Window>,因此只有在将实例分配给类型为IComparer<Window>或{的变量时,才能访问或调用这些方法。 {1}}。

IComparer

明确实现接口以保持类的公共接口清晰,并隐藏基础结构接口的方法以进行比较,相等等。

答案 1 :(得分:1)

使用第二种方法,只有在将对象声明为两个接口之一的实例时,这些方法才有效:

WindowComparer wcOne = new WindowComparer();
Generic.IComparer<Window> wcTwo = new WindowComparer();
IComparer wcThree = new WindowComparer();

在此示例中,wcOne将没有两个Compare方法,因为它们是明确实现的。 wcTwo将能够使用Generic.IComparer<Window>中的wcThreeIComparer将能够使用{{1}}中的{。}}。

答案 2 :(得分:0)

        return ((this as IComparer<Window>).Compare((Window)x, (Window)y));

答案 3 :(得分:0)

要调用this实例上的explicit interface implementation,您必须this投射到该界面,如

return ((Generic.IComparer<Window>)this).Compare((Window)x, (Window)y);

顺便说一下,您是否将您的班级置于System名称空间内,或者您是否有using别名声明名称Generic