2010-03-26 90 views
26

這是故事。我創建了一個界面IVehicle。我明確實施了我的課程中的界面Vehicle.cs爲什麼我不能在明確實現接口的類中調用方法?

這裏是我的接口:

Interface IVehicle 
{ 
     int getWheel(); 
} 

這裏是我的類:

class Vehicle: IVehicle 
{ 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(getWheel()); 
    } 
} 

注意getWheel()明確實施。現在,當我嘗試在我的Vehicle類中嘗試調用該方法時,我收到一個錯誤,指出getWheel()在當前上下文中不存在。有人能幫助我瞭解我做錯了什麼嗎?

+0

作爲一個Java的人接口類型

public class Foo : IBar { readonly IBar bar; public Foo() { bar = this; } } 

然後調用成員,我很奇怪,爲什麼這個令人費解的事情存在?爲什麼會有人想要上述存在,它獲得了什麼優勢? – 2010-03-26 02:11:52

+0

在明確實施的成員上指定可見性修飾符是語法錯誤。一旦您的對象已被轉換爲您的界面類型,該成員始終可以訪問。 – Trillian 2010-03-26 02:14:32

+3

@mP如果您正在使用通用成員實現多個接口,則這允許您爲每個接口提供不同的定義。它還增加了清理智能感知,因爲顯式成員不可見或不可用,除非您投射到適當的界面。 – 2010-12-21 18:27:33

回答

35

當您明確實現接口時,首先必須將該對象轉換爲接口,然後才能調用該方法。換句話說,只有當方法作爲接口類型在對象上調用時,方法纔可用,而不是作爲具體類型。

class Vehicle: IVehicle { 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(((IVehicle)this).getWheel()); 
    } 
} 

有關詳細信息,請參閱此reference。以下是相關代碼片段:

在方法調用,屬性訪問或索引器訪問中,無法通過完全限定的名稱訪問顯式接口成員實現。一個顯式的接口成員實現只能通過一個接口實例來訪問,在這種情況下,只能通過它的成員名稱來引用。

對於它的價值 - 這可能不是一個特別好用的顯式接口實現。通常情況下,如果您有一個類具有完整的典型操作接口的類,並且實現了可能取代其中一些操作的接口,那麼您希望使用顯式實現。規範示例是實現IDisposableFile類。它將有一個Close()方法,但需要執行Dispose()。當作爲File處理時,您將使用Open/Close。但是,在使用說明中打開時,它會將其視爲IDisposable並致電Dispose。在這種情況下,Dispose只需調用Close。您不一定要將Dispose作爲File實施的一部分公開,因爲可以從Close獲得相同的行爲。

+0

謝謝。我只做了這件事以證明我可以做到。至此,我正在使用的這本書沒有給出任何理由表明需要明確實現接口。 – tyrone302 2010-03-26 18:26:25

+0

另一個常見的例子是在Winforms應用程序生成的'.Designer'文件中。每個控件都是在一對'.BeginInit()'和'.EndInit()'方法之間初始化的,但是這些調用都是在*將控件投射到'ISupportInitialize'之後。 – kdbanman 2015-11-25 17:51:36

11

根據MSDN

這是可以實現的 接口成員明確地創造一個 類成員只能通過接口稱爲 ,並且是特定 到該接口。

而在C# language specifications

它是不可能通過其全 限定名來訪問,方法調用的 顯式接口成員 實現, 屬性訪問或索引訪問。一個 顯式接口成員 實現只能通過一個接口實例訪問 ,並且在這種情況下 簡單地通過其成員名稱引用 。

要訪問此成員,您可以先將該類轉換爲接口,然後對其進行訪問。

3

避免大量枯燥的蒙上你的類,你可以創建一個指針使用bar.

相關問題