今天编写一个字符串比较程序时,用到了IComparer和IComparer<T>这两个接口。在自动生成IComparer<T>的接口时,系统提示了显式实现和隐式实现的选择,开始选择显式实现,但是实现后在类中的别的方法调用总是出现问题,提示无法访问该方法,后来在网上查找了接口的的显式和隐式实现,自己也学些了相关的知识,非常惭愧,在自己编写的程序中很少使用接口。
下面的内容是网上找到的:
接口的实现分为:隐式实现和显式实现。
隐式接口实现:如果类或者结构要实现的是单个接口,可以使用隐式实现。
显式接口实现:如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。显示实现是通过使用接口的完全限定名来实现接口成员的。
使用显式接口成员执行体通常有两个目的:
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、
显式接口成员执行体避免了接口成员之间因为同名而发生混淆
。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。
如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现
。
许多网页给出了例子:
比如:IGoodBye接口中有speak()方法,IHello中有speak()方法,如果不采用显式实现,可能会出现问题。
简要总结一下就是:
1.接口显式实现,避免了名字污染;实现了一个类中实现多个具有相同名字的接口。
2. 显式实现后在程序中调用实现的方法就稍微麻烦了一点,需要采用((接口名)new 实现类()).Method()才能调用。
在自己编写程序中就是采用((IComparer<string>)(new StringComparerbyDigit())).Compare(str1, str2)实现类内对方法的调用的
从程序的开发角度考虑,在程序实现时,可以定义一个内部方法,这样就方便调用了