本教程演示如何显式实现接口成员以及如何从接口实例访问这些成员。
实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。本教程包含两个示例。第一个示例阐释如何显式实现和访问接口成员。第二个示例展示如何实现具有相同成员名的两个接口。
本示例声明一个 IDimensions
接口和一个 Box
类,该类显式实现接口成员 Length
和 Width
。通过接口实例 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
//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());
显式接口实现还允许程序员继承共享相同成员名的两个接口,并为每个接口成员提供一个单独的实现。本示例同时以公制单位和英制单位显示框的尺寸。Box
类继承 IEnglishDimensions
和 IMetricDimensions
两个接口,它们表示不同的度量衡系统。两个接口有相同的成员名 Length
和 Width
。
// 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
如果希望默认度量采用英制单位,请正常实现 Length
和 Width
这两个方法,并从 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());