C#中接口多重继承的注意事项

经常,一个类会实现多个接口,比如用户的一个控件继承自"IEdit"和"ICombo",每个接口无疑都有一个Paint方法来供子类实现如何画他们,但是多重继承就会出现问题,默认情况下,C#止允许实现Paint方法。
现在有一个比较钻牛角尖的问题,如何在派生的类里面实现这两个接口的相同名称的方法呢?

通过试验,翻阅MSDN,我总结了这么几条规律:
本文可参考
MSDN 配合理解

1。要么只实现一个方法,否则函数重明,就会存在二义性
2。如果确实想两个方法都实现,必须在接口的实现部分注意这么几点:
(1)。对有相同名称的方法在实现时,前面不能加public等关键词。每个方法前必须冠以相应的接口名。
比如:void IFace1.Print(){......};
            void IFace2.Print(){......};
(2)。对于不通名称的方法,事项是前面必须冠以"public"标识符。
以上两个规则缺一不可,否则会收到编译错误。
3。创建类实例时,如何饮用不通接口的相同方法呢?方法如下:
1。如果调用那个接口的实现,则必须将示例强制转换为相应接口类型。
比如:
FacetoFace face;
((IFace1)face).Print();或者
((IFace2)face).Print();

完整的例子见下面

using System;

namespace TestInterface
{
 /// <summary>
 /// Class1 的摘要说明。
 /// 本代码演示了C#中接口的基本特征,并检验了作者心中迷惑但是书中没有详细讲解的地方,比如接口多重
 /// 继承时,多个父类接口有相同的方法时,派生接口如何定义、使用的问题
 /// </summary>
 interface IFace1
 {
  void Print();
  void Hello();
 }
 interface IFace2
 {
  void Print();
  void Goodbye();
 }
 class FacetoFace : IFace1,IFace2
 {
  #region IFace1 成员

  void IFace1.Print()
  {
   Console.WriteLine("这是IFace1的Print函数");
  }

  public void Hello()
  {
   // TODO:  添加 FacetoFace.Hello 实现
   Console.WriteLine("IFace1向您说Hello!");
  }

  #endregion

  #region IFace2 成员
  
  public void Goodbye()
  {
   // TODO:  添加 FacetoFace.Goodbye 实现
   Console.WriteLine("IFace2向您说GoodBye");
  }
  
  void IFace2.Print()
  {
   Console.WriteLine("这是IFace2的Print函数");
  }

  #endregion
 }
 class Class1
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   //
   // TODO: 在此处添加代码以启动应用程序
   FacetoFace facetest1=new FacetoFace();
   ((IFace1)facetest1).Print();
   ((IFace2)facetest1).Print();
   facetest1.Hello();
   facetest1.Goodbye();
   //
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值