zoukankan      html  css  js  c++  java
  • 接口的显示和隐式实现

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现。昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习。

        通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”。费话不说,例子如下:

            interface IAnimal
        {
           void Dog();
        }
        class Animal:IAnimal
        {
          public void Dog()
          {
            Console.WriteLine("dog...");
          }
         }

      定义了一个IAnimal接口,一般我们都会这么调用:

        //通过类调用

        Animal animal = new Animal();
        animal.Dog();

        //或者通过接口调用

        IAnimal animal = new Animal();

        animal.Dog();

      类和接口都能调用到,事实上这就是“隐式接口实现”。

      那么“显示接口实现”是神马模样呢?

      interface IAnimal
      {
        void Dog();
      }
      class Animal:IAnimal
      {
        void IAnimal.Dog()
        {
          Console.WriteLine("dog...");
        }
      }

        //只能通过接口调用

        IAnimal animal = new Animal();

        animal.Dog();

        用类的方法去实现时会报错,不允许,“显示接口实现”只允许接口实现。如果真想用类来实现呢,那必须要进行一下强制类型转换。

        //强制类型转换后即可

        Animal animal = new Animal();
        (animal as IAnimal).Dog();

    既然显示接口实现这么不给力,为什么还要存在了,凡事存在即合理。在实际项目中,有时某个类往往会继承多个接口,而接口中往往会有一些相同名称、参数与类型的值。通过显式接口实现可以为避免一些不必要的歧义(我在项目中碰到的不多,可能是因为项目太小的原因吧)。

      显示接口实现与隐式接口实现的适应场景

      1. 当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。
      2. 当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。即使没有相同的方法签名,仍推荐使用显式接口,因为可以标识出哪个方法属于哪个接口。
      3. 隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问。

           显示接口存在的问题:

                     1. 不能通过实现它的类去调用这个方法,必须要将其转为对应的接口后才可以调用显式实现的方法。

                      2. 调用显式实现的方法时会发生装箱,浪费内存。

                      3. 第三个问题也是最大的一个问题:如果类A显式的实现了一个接口中的方法,那么继承于类A的类不能调用该方法。

  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/zhengwei-cq/p/8443824.html
Copyright © 2011-2022 走看看