C# 程序员参考--显式接口实现教程

发表于:2007-07-14来源:作者:点击数: 标签:
C# 程序员 参考--显式接口实现教程: 本教程演示如何显式实现接口成员以及如何从接口实例访问这些成员。 教程 实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。本教程包含两个示例
C# 程序员参考--显式接口实现教程:

本教程演示如何显式实现接口成员以及如何从接口实例访问这些成员。

教程

实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。本教程包含两个示例。第一个示例阐释如何显式实现和访问接口成员。第二个示例展示如何实现具有相同成员名的两个接口。

示例 1

本示例声明一个 IDimensions 接口和一个 Box 类,该类显式实现接口成员 LengthWidth。通过接口实例 myDimensions 访问这些成员。

// explicit1.csinterface IDimensions {   float Length();   float Width();}class Box : IDimensions {   float lengthInches;   float widthInches;   public Box(float length, float width)    {      lengthInches = length;      widthInches = width;   }   // Explicit interface member implementation:    float IDimensions.Length()    {      return lengthInches;   }   // Explicit interface member implementation:   float IDimensions.Width()    {      return widthInches;         }   public static void Main()    {      // Declare a class instance "myBox":      Box myBox = new Box(30.0f, 20.0f);      // Declare an interface instance "myDimensions":      IDimensions myDimensions = (IDimensions) myBox;      // Print out the dimensions of the box:      /* The following commented lines would produce compilation          errors because they try to aclearcase/" target="_blank" >ccess an explicitly implemented         interface member from a class instance:                   */      //System.Console.WriteLine("Length: {0}", myBox.Length());      //System.Console.WriteLine("Width: {0}", myBox.Width());      /* Print out the dimensions of the box by calling the methods          from an instance of the interface:                         */      System.Console.WriteLine("Length: {0}", myDimensions.Length());      System.Console.WriteLine("Width: {0}", myDimensions.Width());   }}

输出

Length: 30Width: 20

代码讨论

  • 请注意 Main 方法中下列代码行被注释掉,因为它们将产生编译错误。显式实现的接口成员不能从类实例访问:
    //System.Console.WriteLine("Length: {0}", myBox.Length());//System.Console.WriteLine("Width: {0}", myBox.Width());
  • 还请注意,Main 方法中的下列代码行成功输出框的尺寸,因为这些方法是从接口实例调用的:
    System.Console.WriteLine("Length: {0}", myDimensions.Length());System.Console.WriteLine("Width: {0}", myDimensions.Width());

示例 2

显式接口实现还允许程序员继承共享相同成员名的两个接口,并为每个接口成员提供一个单独的实现。本示例同时以公制单位和英制单位显示框的尺寸。Box 类继承 IEnglishDimensionsIMetricDimensions 两个接口,它们表示不同的度量衡系统。两个接口有相同的成员名 LengthWidth

// explicit2.cs// Declare the English units interface:interface IEnglishDimensions {   float Length();   float Width();}// Declare the metric units interface:interface IMetricDimensions {   float Length();   float Width();}// Declare the "Box" class that implements the two interfaces:// IEnglishDimensions and IMetricDimensions:class Box : IEnglishDimensions, IMetricDimensions {   float lengthInches;   float widthInches;   public Box(float length, float width)    {      lengthInches = length;      widthInches = width;   }// Explicitly implement the members of IEnglishDimensions:   float IEnglishDimensions.Length()    {      return lengthInches;   }   float IEnglishDimensions.Width()    {      return widthInches;         }// Explicitly implement the members of IMetricDimensions:   float IMetricDimensions.Length()    {      return lengthInches * 2.54f;   }   float IMetricDimensions.Width()    {      return widthInches * 2.54f;   }   public static void Main()    {      // Declare a class instance "myBox":      Box myBox = new Box(30.0f, 20.0f);      // Declare an instance of the English units interface:      IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;      // Declare an instance of the metric units interface:      IMetricDimensions mDimensions = (IMetricDimensions) myBox;      // Print dimensions in English units:      System.Console.WriteLine("Length(in): {0}", eDimensions.Length());      System.Console.WriteLine("Width (in): {0}", eDimensions.Width());      // Print dimensions in metric units:      System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());      System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());   }}

输出

Length(in): 30Width (in): 20Length(cm): 76.2Width (cm): 50.8

代码讨论

如果希望默认度量采用英制单位,请正常实现 LengthWidth 这两个方法,并从 IMetricDimensions 接口显式实现 Length 和 Width 方法:

// Normal implementation:public float Length(){   return lengthInches;}public float Width(){   return widthInches;}// Explicit implementation:float IMetricDimensions.Length() {   return lengthInches * 2.54f;}float IMetricDimensions.Width() {   return widthInches * 2.54f;}

这种情况下,可以从类实例访问英制单位,而从接口实例访问公制单位:

System.Console.WriteLine("Length(in): {0}", myBox.Length());System.Console.WriteLine("Width (in): {0}", myBox.Width());   System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());

原文转自:http://www.ltesting.net