显示接口实现

实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。
显式接口实现还允许程序员继承共享相同成员名的两个接口,并为每个接口成员提供一个单独的实现。下面是关于这方面的示例:
 1None.gif//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。
 2None.gif
 3None.gif// explicit2.cs
 4None.gif// 声明英制单位接口:
 5None.gifinterface IEnglishDimensions 
 6ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 7InBlock.gif   float Length();
 8InBlock.gif   float Width();
 9ExpandedBlockEnd.gif}

10None.gif// 声明公制单位接口:
11None.gifinterface IMetricDimensions 
12ExpandedBlockStart.gifContractedBlock.gifdot.gif{
13InBlock.gif   float Length();
14InBlock.gif   float Width();
15ExpandedBlockEnd.gif}

16None.gif// 声明实现以下两个接口的“Box”类: 
17None.gif// IEnglishDimensions 和 IMetricDimensions:
18None.gifclass Box : IEnglishDimensions, IMetricDimensions 
19ExpandedBlockStart.gifContractedBlock.gifdot.gif{
20InBlock.gif   float lengthInches;
21InBlock.gif   float widthInches;
22InBlock.gif   public Box(float length, float width) 
23ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
24InBlock.gif      lengthInches = length;
25InBlock.gif      widthInches = width;
26ExpandedSubBlockEnd.gif   }

27InBlock.gif// 显式实现 IEnglishDimensions 的成员:
28InBlock.gif   float IEnglishDimensions.Length() 
29ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
30InBlock.gif      return lengthInches;
31ExpandedSubBlockEnd.gif   }

32InBlock.gif   float IEnglishDimensions.Width() 
33ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
34InBlock.gif      return widthInches;      
35ExpandedSubBlockEnd.gif   }

36InBlock.gif// 显式实现 IMetricDimensions 的成员:
37InBlock.gif   float IMetricDimensions.Length() 
38ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
39InBlock.gif      return lengthInches * 2.54f;
40ExpandedSubBlockEnd.gif   }

41InBlock.gif   float IMetricDimensions.Width() 
42ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
43InBlock.gif      return widthInches * 2.54f;
44ExpandedSubBlockEnd.gif   }

45InBlock.gif   public static void Main() 
46ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
47InBlock.gif      // 声明类实例“myBox”:
48InBlock.gif      Box myBox = new Box(30.0f20.0f);
49InBlock.gif      // 声明英制单位接口的实例:
50InBlock.gif      IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;
51InBlock.gif      // 声明公制单位接口的实例:
52InBlock.gif      IMetricDimensions mDimensions = (IMetricDimensions) myBox;
53InBlock.gif      // 以英制单位打印尺寸:
54InBlock.gif      System.Console.WriteLine("Length(in): {0}", eDimensions.Length());
55InBlock.gif      System.Console.WriteLine("Width (in): {0}", eDimensions.Width());
56InBlock.gif      // 以公制单位打印尺寸:
57InBlock.gif      System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
58InBlock.gif      System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());
59ExpandedSubBlockEnd.gif   }

60ExpandedBlockEnd.gif}

61None.gif
输出
Length(in): 30
Width (in): 20
Length(cm): 76.2
Width (cm): 50.8
代码讨论
如果希望默认度量采用英制单位,请正常实现 Length 和 Width 这两个方法,并从 IMetricDimensions 接口显式实现 Length 和 Width 方法:
None.gif// Normal implementation:
None.gif
public float Length()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif   
return lengthInches;
ExpandedBlockEnd.gif}

None.gif
public float Width()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif   
return widthInches;
ExpandedBlockEnd.gif}

None.gif
// Explicit implementation:
None.gif
float IMetricDimensions.Length() 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif   
return lengthInches * 2.54f;
ExpandedBlockEnd.gif}

None.gif
float IMetricDimensions.Width() 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif   
return widthInches * 2.54f;
ExpandedBlockEnd.gif}

None.gif
这种情况下,可以从类实例访问英制单位,而从接口实例访问公制单位:
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());

转载于:https://www.cnblogs.com/mazhiyuan/articles/286786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值