A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _xixi_ 中级黑马   /  2014-7-8 00:26  /  1559 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _xixi_ 于 2014-7-8 13:02 编辑

显式实现接口,通过接口变量调用,隐式实现接口,通过对象变量调用

  1. interface IFlyable
  2.     {
  3.         void Fly();
  4.     }
  5.     class FeiQin : IFlyable
  6.     {
  7.         public void Fly()
  8.         {
  9.             Console.WriteLine("飞禽都会飞!");
  10.         }

  11.         void IFlyable.Fly()
  12.         {
  13.             Console.WriteLine("。。。。会飞!");
  14.         }
  15.     }
  16.     class Program
  17.     {
  18.         static void Main(string[] args)
  19.         {
  20.             FeiQin feiQin = new FeiQin();
  21.             feiQin.Fly(); //显示"飞禽都会飞!",调用隐式实现接口
  22.             IFlyable fly = feiQin;
  23.             fly.Fly();//显示"。。。。会飞!",调用显式实现接口,只能通过接口变量调用
  24.             Console.ReadKey();
  25.         }
  26.     }
复制代码


看到这里,写了以上代码区别了一下,可是为什么要在一个类里面实现两个同名的方法,这样做有什么实用的意义吗?请大家不吝赐教!

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

9 个回复

正序浏览
c19t043 发表于 2014-7-15 22:42
  • interface IFlyable
  •     {
  •         void Fly();

  • 学习了~
    回复 使用道具 举报
    • interface IFlyable
    •     {
    •         void Fly();
    •     }
    •     class FeiQin : IFlyable
    •     {
    •         public void Fly()
    •         {
    •             Console.WriteLine("飞禽都会飞!");
    •         }
    •         void IFlyable.Fly()
    •         {
    •             Console.WriteLine("。。。。会飞!");
    •         }
    •     }
    • -------------------→FeiQin类继承了2个接口,IFlyable1,IFlyable2,
    • interface IFlyable1
    •     {
    •         void Fly();
    •     }
    • interface IFlyable2
    •     {
    •         void Fly();
    •     }
    • class FeiQin:IFlyable1,IFlyable2
    • {
    •      public void Fly()
    •      {
    •             Console.WriteLine("飞禽都会飞!");
    •      }
    • }
    •     class Program
    •     {
    •         static void Main(string[] args)
    •         {
    •             FeiQin feiQin = new FeiQin();
    •             feiQin.Fly();
    •             Console.ReadKey();
    •         }
    •     }
    • 你认为FeiQin类中调用的那个接口的Fly()?
    • 继承接口,编译器,只认FeiQin类中是否实现了接口中的Fly();
    • 不管子类中有几个Fly()方法
    • --------------------------------------------→↓
    • 首先,我们定义接口的时候,不会有2个相同意义的接口
    • → →  →→鸟类都有翅膀,并不代表有翅膀就能长时间飞行,
    • 我们将IFlyable1接口中的Fly(),是长时间的飞行
    • IFlyable2接口中的Fly(),是短时间的飞行
    • 所以,Fly()有了2个分支
    • class Bird:IFlyable1,IFlyable2
    • {
    •      public void Fly() //默认的继承自IFlyable1,,,,,,,,,
    •      {
    •             Console.WriteLine("燕子能长时间飞行!");
    •      }
    •      
    •      public void IFlyable2.Fly() //显示实现IFlyable2的Fly();
    •      {
    •             Console.WriteLine("鸭子能短时间飞行!");
    •      }
    • }
    •     class Program
    •     {
    •         static void Main(string[] args)
    •         {
    •             Bird b = new Bird();
    •             b.Fly(); //长时间飞行
    •             b.IFlyable.Fly();//短时间飞行
    •             Console.ReadKey();
    •         }
    •     }

    评分

    参与人数 1技术分 +1 收起 理由
    czwanglei + 1

    查看全部评分

    回复 使用道具 举报
    weiwei10153 发表于 2014-7-8 09:23
    显示实现接口,可以解决方法重名的问题,FeiQin 类实现了IFlyable接口,那么就必须重写IFlyable接口中的Fly方 ...

    谢谢你的耐心回答
    回复 使用道具 举报
    向晓伟 发表于 2014-7-8 09:25
    隐式实现可以通过接口和类调用
    显示实现只能通过接口来调用
    显示实现可以隐藏实现代码,而且在一些使用接口 ...

    谢谢你的回答,你的回答解决了我的疑问
    回复 使用道具 举报
    也一直不明白。。学习了   
    回复 使用道具 举报
    2楼说的太对了。。
    回复 使用道具 举报
    向晓伟 来自手机 中级黑马 2014-7-8 09:25:58
    板凳
    隐式实现可以通过接口和类调用
    显示实现只能通过接口来调用
    显示实现可以隐藏实现代码,而且在一些使用接口的系统中,调用者只能通过接口调用而不是底层的类来访问。

    评分

    参与人数 1技术分 +1 收起 理由
    czwanglei + 1

    查看全部评分

    回复 使用道具 举报 1 0
    显示实现接口,可以解决方法重名的问题,FeiQin 类实现了IFlyable接口,那么就必须重写IFlyable接口中的Fly方法,但是FeiQin 类本身有一个Fly方法,而实现接口的类必须重写接口中所有的方法,为了区分这两个方法,通过显示实现接口的方式,把实现IFlyable接口的方法设置为私有方法.在外部调用方法的时候,普通类只能调用到FeiQin 类的public void Fly()方法,而通过接口调用,就可以调用到private void IFlyable.Fly()的方法

    评分

    参与人数 1技术分 +1 收起 理由
    czwanglei + 1

    查看全部评分

    回复 使用道具 举报
    这个问题我也不懂,抢个座,坐等大牛解答……
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马