实现接口成员的两种方式有何区别有什么用途

来源:互联网 发布:知乎 涉谷昴 编辑:程序博客网 时间:2024/05/02 01:52

若要实现接口成员,类中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。但是如果使用显示的实现方式,就可不必使用publicz关键字.为什么要提供显示的实现方式呢,他们有什么区别?

显式实现接口成员与实现接口成员的区别是方法名字前面有接口名。这样就可不使用public关键字来实现接口成员.这样就导致了在使用上有所区别.使用时的区别是如果只有显式实现,则只能通过接口类型的变量来调用该方法。如果只有非显式实现,则通过类类型变量和接口类型变量都可以调用。如果同时有两种实现,则接口类型的变量调用显式实现的方法,类类型的变量调用非显式实现方法.引用MSDN上的一个示例说明一下,示例如下:

// 声明接口
interface IDimensions
{
   float Length();
   float Width();
}
//声明实现接口的类
class Box : IDimensions
{
   float lengthInches;
   float widthInches;

   public Box(float length, float width)
   {
      lengthInches = length;
      widthInches = width;
   }
   // 显式接口成员实现,还可以使用public关键字实现:public float Length() 
   float IDimensions.Length()
   {
      return lengthInches;
   }
   // 显式接口成员实现,还可以使用public关键字实现:public float Width() 
   float IDimensions.Width()
   {
      return widthInches;     
   }

   public static void Main()
   {
      // 声明类实例“myBox”:
      Box myBox = new Box(30.0f, 20.0f);
      // 声明接口实例“myDimensions”:
      IDimensions myDimensions = (IDimensions) myBox;
      // 打印出盒子的尺寸:
      /* 下列注释行将产生编译
         错误,因为这些行试图从类实例访问显式实现的
         接口成员. 如果使用pubilc关键字实现接口则该语句可通过编译 */
      //System.Console.WriteLine("Length: {0}", myBox.Length());
      //System.Console.WriteLine("Width: {0}", myBox.Width());
      /* 从接口的实例调用方法,
         以打印出盒子的尺寸:                         */
      System.Console.WriteLine("Length: {0}", myDimensions.Length());
      System.Console.WriteLine("Width: {0}", myDimensions.Width());
      System.Console.Read();     
   }
}

通常使用这两种方式中的任何一个都能实现借口成员.但是有什么特殊用途吗?
1.通过显示实现可以强制用户只能通过接口访问和使用方法、属性、事件、索引器。
2.在同一各类中,可以使用两种方法同时实现接口成员,这就可以分别从类实例和接口实例调用接口成员.而接口成员的这两个实现的返回类型(如果有),参数个数,参数类型完全相同,但是却可以执行不同的动作.例如:在上面的代码中加入如下代码:
// 接口成员实现:
   public float Length()
   {
       return lengthInches+1;
   }
   // 接口成员实现:
   public float Width()
   {
       return widthInches+1;
   }
这种不同有什么实际意义,是否还有什么其它用途,望高手留言赐教!!
 

原创粉丝点击