使用 EIMI 也可能造成一些严重后果,所以应该尽量避免使用 EIMI 。幸好,泛型接口可帮助我们在大多数时候避免使用 EIMI 。但有时仍然需要它们。(比如实现具有相同名称和签名的两个接口方法时)
EIMI 最主要的问题如下:
1.没有文档解释类型具体如何实现一个 EIMI 方法,VS也没有“智能感知”支持。
2.值类型的实例在转换成接口时装箱。
3.EIMI 不能由派生类型调用。
//--
(问题一)文档在列出一个类型的方法时,会列出显式接口方法实现(EIMI),但没有提供类型特有的帮助,只有接口方法的常规性帮助。例如,Int32类型恶文档只是说它实现了IConcertible接口的所有方法。能做到这一步已经不错,它使开发人员知道存在这些方法。但也使开发人员感到困惑,因为不能直接在一个Int32上调用一个IConcertible方法。
要在一个Int32上调用ToSingle,首先必须将其转换为IConvertible。
对类型转换的要求不明确,而许多开发人员自己看不出问题出在哪里。还有一个更让人烦恼的问题:Int32值类型转换为IConvertible会发生装箱,既浪费内存,又损害性能。(问题二)
//--
(问题三)不能被派生类调用:
在Derived的CompareTo方法中调用base.CompareTo导致C#编译器报错。现在的问题是,Base类没有提供一个可供调用的公共或受保护CompareTo方法,它提供的是一个只能用ICompareble类型的变量来调用的CompareTo方法。
将this转换成ICompareble变量c,然后用c调用CompareTo。但Derived的公共CompareTo方法充当了Derived的ICompareble.CompareTo方法的实现,所以造成了无穷递归。这个可以通过声明没有ICompareble接口的Derived类来解决。
现在,前面的CompareTo方法将调用Base中的CompareTo方法。但有时不能因为想在派生类中实现接口方法就将接口从类型中删除。解决这个问题的最佳方法是在基类中除了提供一个被选为显式实现的接口方法,还要提供一个虚方法。然后Derived类可以重写虚方法。