1. 程式人生 > >(轉載)C# 介面的隱式與顯示實現

(轉載)C# 介面的隱式與顯示實現

來源:https://www.cnblogs.com/ben-zhang/archive/2012/12/18/2823455.html 

以前在用到介面時,從來沒注意到介面分為隱式實現與顯示實現。昨天在瀏覽部落格時看到相關內容,現在根據自己的理解記錄一下,方便日後碰到的時候溫習溫習。

    通俗的來講,“顯示介面實現”就是使用介面名稱作為方法名的字首;而傳統的實現方式稱之為:“隱式介面實現”。費話不說,例子如下:

        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. 隱式介面實現,類和介面都可訪問介面中方法。顯式介面實現,只能通過介面訪問。