2012-06-14 142 views
2

我是C#的新手,並且在理解如何實現接口的擴展方法時遇到問題。我沒有找到關於這個問題的任何材料。從我發現約在C#中的一般擴展方法的材料我希望下面這個簡單的例子示範工作:實現擴展方法接口C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace testExtension 
{ 
public interface IcheckThingsOut 
{ 
    bool x(); 
} 
public static class extensionInterface 
{ 
    public static bool y(this IcheckThingsOut bla) { return true;} 
} 
public class implementInteface : IcheckThingsOut 
{ 
    bool IcheckThingsOut.x() 
    { 
     return true; 
    } 
    bool IcheckThingsOut.y() 
    { 
     return false; 

    } 
} 
} 

但是,編譯器仍不滿意。我錯過了什麼,這裏的正確語法是什麼(與代碼具有相同的語義)?

+0

什麼是錯誤信息? – unholysampler

+0

編譯器說什麼?嘗試實現'y()'而不明確聲明接口名稱。 –

回答

3

你搞砸的擴展方法和接口的概念。擴展方法只是編譯器在靜態類上調用靜態方法的簡便方法。他們不擴展接口。編譯器做什麼用的擴展方法是當:

IcheckThingsOut instance = new IcheckThingsOutImpl(); 
    instance.y(); 

...將被轉換爲:

IcheckThingsOut instance = new IcheckThingsOutImpl(); 
    extensionInterface(instance, y); 

因此,大家可以看到,y是不是你的接口上的方法。這就是爲什麼你不能在實現中明確實現它。

2

您無法在「擴展」類或接口中更改擴展方法的實現。擴展方法是實現。

擴展方法提供了一種將方法「添加」到接口或類的方法。整個想法是你正在擴展的接口或類並不知道這些方法。換句話說,您可以在不改變類或接口本身的情況下「添加」功能。 (請注意,雖然符號表明您正在向接口添加方法,但實際上,就運行時而言,這些方法是純靜態方法)。

0

的IcheckThingsOut不到風度具有布爾Y()

1
bool IcheckThingsOut.y() 
{ 
    return false; 

} 

是錯誤的:IcheckThingsOut不提供原型函數y。它應該只是

bool y() 
{ 
    return false; 
} 

,因爲它只是遮蔽的另一種方法

3

你似乎希望使用的是「擴展方法」。爲此,您的extensionInterface類正確實施。

但是,創建擴展方法實際上並不會擴展您的接口,因此儘管您可以調用myIcheckThingsOut.y(),但您不能在隱式或顯式實現IcheckThingsOut的類中重新實現該方法。