日常收集C#接口知识(知识全面)

2019-12-30 11:28:58王旭

  实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。显式接口实现还允许程序员继承共享相同成员名的两个接口,并为每个接口成员提供一个单独的实现。

  下面例子中同时以公制单位和英制单位显示框的尺寸。Box类继承 IEnglishDimensions和 IMetricDimensions两个接口,它们表示不同的度量衡系统。两个接口有相同的成员名 Length 和 Width。

  程序清单1 DemonInterface.cs


 interface IEnglishDimensions {
 float Length ( ) ;
 float Width ( ) ;
 }
 interface IMetricDimensions {
 float Length ( ) ;
 float Width ( ) ;
 }
 class Box : IEnglishDimensions, IMetricDimensions {
 float lengthInches ;
 float widthInches ;
 public Box(float length, float width) {
 lengthInches = length ;
 widthInches = width ;
 }
 float IEnglishDimensions.Length( ) {
 return lengthInches ;
 }
 float IEnglishDimensions.Width( ) {
 return widthInches ;
 }
 float IMetricDimensions.Length( ) {
 return lengthInches * .f ;
 }
 float IMetricDimensions.Width( ) {
 return widthInches * .f ;
 }
 public static void Main( ) {
 //定义一个实类对象 "myBox"::
 Box myBox = new Box(.f, .f);
 // 定义一个接口" eDimensions"::
 IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;
 IMetricDimensions mDimensions = (IMetricDimensions) myBox;
 // 输出:
 System.Console.WriteLine(" Length(in): {}", eDimensions.Length( ));
 System.Console.WriteLine(" Width (in): {}", eDimensions.Width( ));
 System.Console.WriteLine(" Length(cm): {}", mDimensions.Length( ));
 System.Console.WriteLine(" Width (cm): {}", mDimensions.Width( ));
 }
 } 

  输出:Length(in): 30,Width (in): 20,Length(cm): 76.2,Width (cm): 50.8

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


 public float Length( ) {
 return lengthInches ;
 }
 public float Width( ){
 return widthInches;
 }
 float IMetricDimensions.Length( ) {
 return lengthInches * .f ;
 }
 float IMetricDimensions.Width( ) {
 return widthInches * .f ;
 } 

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


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( )) ;