2010-01-06 63 views
1

我可以使用接口方法代替委託嗎?怎麼樣?我發現搜索該接口方法比使用委託更快。我將不勝感激一個簡單的代碼片段。代表和接口如何互換使用?

+1

你在說什麼? 接口與委託的語義有很大的不同,所以您是否使用A或B,視情況而定。 – 2010-01-06 10:04:29

+1

@Frederik:在這裏不歡迎評論與磨蝕程度。對於那些有各種技術知識和能力的人來說,SO是一個更專業的地方。 @薩米爾:我同意米奇你問了25個問題,接受他們中的一些。 – AnthonyWJones 2010-01-06 10:07:45

+0

給問題添加一些上下文會很好。你試圖優化的具體問題是什麼?或者這是一個普遍的問題? – Gishu 2010-01-06 10:14:18

回答

6

從理論上講,這是可能做到的一切代表們用接口來完成(Java沒有代表,例如)包含一個單一的方法。但是,它使代碼更加冗長,並且沒有多少好處。然後再一次,沒有類可以做所有事情,並且可能做得更快。這並不意味着你應該避免使用類。調用委託方法可能是稍微比調用接口方法慢。你不應該關心微型優化。使用任何符合您特定需求的東西

0

使用委託,而不是接口的最大優點是,當一個類只能用於任何給定的接口提供一個實現,它可以爲任意數量的不同的方法創建委託。例如,假設Button不暴露Click事件,Button暴露了一個類型爲IButtonClickHandler的ClickRecipient屬性,其中一個方法爲「ButtonClick」。有兩個按鈕應該有不同的處理程序的表單必須定義一個單獨的類來處理它們中的至少一個,因爲表單本身只能有一個ButtonClick實現。相比之下,Button事件接受EventHandler的委託,並且表單可以爲任意數量的EventHandler方法創建委託。請注意,使用泛型和「標記類型」,通過使Button(Of T)具有IButtonClickHandler(Of T)類型的ClickRecipientProperty,可以顯着減輕此問題;一個表單可以有一個Button(Of FooButton)和一個Button(BarButton),併爲它們的接口提供不同的實現。人們還可以有ButtonConverter(中T,U)包裝類,這將實現IButtonClickHandler(中T),並調用IButtonClickHandler(中U).ButtonClick。

接口是好的,如果使用模式將在99%的時間匹配的內容的界面被設計用於(的時間的剩餘1%,可以創建一箇中間包裝類)。

3

參見Delegates Are Anonymous Interfaces by Mark Seemann

在上述文章馬克塞曼提到的示例

接口方法

public interface IMyInterface 
{ 
    int DoIt(string message); 
} 
public string DoStuff(IMyInterface strategy) 
{ 
    return strategy.DoIt("Ploeh").ToString(); 
} 

委派方法

public string DoStuff(Func<string, int> strategy) 
{ 
    return strategy("Ploeh").ToString(); 
}