implicit vs explicit interface implementation
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
C#: Interfaces - Implicit and Explicit implementation
有人能解释一下这两种动物之间的区别以及如何使用它们吗?在afaik中,许多2.0之前的类都是在没有泛型类型的情况下实现的,因此,后一个版本实现了这两种风格的接口。唯一需要使用它们的原因是什么?
你也能详细解释一下如何使用它们吗?
谢谢
关于这一点,有一篇非常详细的博客文章。
基本上,通过隐式接口实现,您可以像访问类的一部分一样访问接口方法和属性。通过显式接口实现,您只能在将其视为该接口时访问它们。
在您将一个接口用于另一个接口的时间方面,有时您必须使用显式接口实现,因为您要么具有与接口具有相同签名的属性/方法,要么希望实现具有相同签名的两个接口,并对那些匹配的属性/方法具有不同的实现。
以下规则来自BradAbrams设计指南博客。
- 不要将显式成员用作安全边界。任何将实例强制转换到接口的客户机都可以调用它们。
- 使用显式成员隐藏实现详细信息
- 请使用显式成员来近似私有接口实现。
- 请公开另一种方法来访问允许子类重写的任何显式实现的成员。除非出现冲突,否则使用相同的方法名。
Brad博客中的评论中还提到,在对值类型使用显式实现时涉及装箱,因此要注意性能成本。
用外行的术语来说,如果一个类继承了两个或多个接口,并且接口恰好具有相同的方法名,那么如果使用隐式接口实现,那么该类就不知道正在实现哪个接口方法。这是您将显式实现接口的场景之一。
隐式接口实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class MyClass : InterfaceOne, InterfaceTwo { public void InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } |
显式接口实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class MyClass : InterfaceOne, InterfaceTwo { void InterfaceOne.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } void InterfaceTwo.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } |
下面的链接有一个很好的视频来解释这个概念
显式接口实现
从迷宫式实现本身来看,还有另外一种方法:http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx。
但简而言之,隐式实现为您提供了IS-A类型转换,除非对象显式类型转换为该接口类型,否则显式实现将不可访问。