2012-02-28 60 views
1

Visual Studio告訴我,如果我不根據接口聲明它們「明確」,我就不實現這些方法。 這裏是我的方法:明確定義接口

public interface IGetMenus 
{ 
    List<Menu> GetMyMenus(); 
    void InsertMenu(string topic, string subTopic); 
    void UpdateMainMenu(int menu_id, string topic); 
    void UpdateSubMenu(int menu_id, string topic); 
} 

下面是如何視覺工作室希望我實現接口的例子:

List<Menu> IGetMenus.GetMyMenus() 
    { 
    } 

這是爲什麼?

+0

您的類是否已經繼承了一個類或實現了具有相同方法聲明的另一個接口(不是'IGetMenus')? – 2012-02-28 14:04:06

+2

但是實現接口的類在哪裏? – vulkanino 2012-02-28 14:04:35

+0

我不知道這個問題存在以前..我知道爲什麼明確實現一個接口..但我沒有方法具有相同的名稱...我知道它雖然..感謝 – BlackFire27 2012-02-28 14:18:40

回答

4

通常原因是你有一個名稱+參數相同但返回類型不同的方法。

在C#中這是無效的,在這種情況下實現接口的唯一方法是明確地執行或移動/重命名其他方法。

2

一個很好的例子是你想確保類想要調用的方法。這通常是一種昂貴的方法,不會添加所需的功能。

ObjectCache就是一個很好的例子。您可以使用隱式方法添加,刪除和檢查項目。但是,枚舉器是明確定義的。

foreach(var item in (ObjectCache as Enumerator)) 
{ 
    ... 
} 

這樣你就不會明確地列舉整個緩存。

+0

很好的例子,將牢記在心下一次,我被問及爲什麼我需要顯式實現,但在這種情況下,問題似乎VS要求顯式實現,通常是重複的方法簽名 – ntziolis 2012-02-28 14:19:08

0

顯式實現成員時需要注意的一件重要的事情是,無法讓派生類重寫父類中顯式實現的接口成員,而不會使該成員不可訪問,也不可能鏈接到(if一個BaseClass明確實現了IFoo.FooDerivedClass覆蓋的唯一方法是實現IFoo.Foo本身;如果派生類這樣做,那麼IFoo.Foo將引用派生類的方法,並且將無法訪問IFoo.Foo實現父類)。因此,如果可能需要派生類成員鏈接到父類實現,那麼將接口成員實現的「膽量」置於protected virtual成員中通常是一個好主意,然後顯式實現接口成員,所以它只需調用protected virtual之一。這將允許派生類同時覆蓋該成員並鏈接到它。