(轉載)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();
既然顯示介面實現這麼不給力,為什麼還要存在了,凡事存在即合理。在實際專案中,有時某個類往往會繼承多個介面,而介面中往往會有一些相同名稱、引數與型別的值。通過顯式介面實現可以為避免一些不必要的歧義(我在專案中碰到的不多,可能是因為專案太小的原因吧)。
顯示介面實現與隱式介面實現的適應場景
- 當類實現一個介面時,通常使用隱式介面實現,這樣可以方便的訪問介面方法和類自身具有的方法和屬性。
- 當類實現多個介面時,並且介面中包含相同的方法簽名,此時使用顯式介面實現。即使沒有相同的方法簽名,仍推薦使用顯式介面,因為可以標識出哪個方法屬於哪個介面。
- 隱式介面實現,類和介面都可訪問介面中方法。顯式介面實現,只能通過介面訪問。