簡體   English   中英

何時使用代理而不是接口

[英]When to Use Delegates Instead of Interfaces

根據這篇文章 ,它說:

在以下情況下使用代理:

  • 一個類可能需要多個方法的實現。

在以下情況下使用接口:

  • 一個類只需要該方法的一個實現。

誰可以給我解釋一下這個?

那是......奇怪而令人困惑。 如果您只需要一個方法的實現... 使用方法 (可能是一個虛方法)。 至於接口,代理的部分是,你可以替代多種不同的實現。

如果我不得不總結一下:

委托類型非常類似於只暴露單個方法的接口,委托實例非常類似於實現該接口的類的實例 - 只是具有大量的編譯器性感,使得它非常容易寫,即x => 2 * x ,沒有(有時)需要實例。

一個代表也有一些其他有用的技巧面向events (多播等),但這聽起來與文章的背景無關。

一個類可能需要多個方法的實現。

public delegate int PerformCalculation(int x, int y);

void SomeMethod()
{
    PerformCalculation PerformCalculation_1 = myDelegateFun_1;
    PerformCalculation PerformCalculation_2 = myDelegateFun_2;
    PerformCalculation_1(5, 3);
    PerformCalculation_2(5, 3);      
}

private int myDelegateFun_1(int x, int y)
{
    return x + y;
}
private int myDelegateFun_2(int x, int y)
{
    return x + y;
}

在上面的示例PerformCalculation_1中,PerformCalculation_2是PerformCalculation的多個實現

A class only needs one implementation of the method

interface IDimensions 
{
   float Length();
}

class Box : IDimensions 
{
   float Length() 
   {
       return lengthInches;
   }
}

在上面的例子中,只有接口公開的方法的單個實現。

在我的簡單頭腦中,這與ICompare / IComparable非常相似。

接口的實現意味着行為是實現類的固有特性。 行為不會根據呼叫者或呼叫情況而改變。

委托說這個操作不是類固有的,而是基於上下文或要定義的調用者。

這個措辭似乎有點令人困惑,但可能會舉例說明。 假設有人正在設計一個按鈕控件,希望在單擊時提供通知。 通常的做法是按鈕維護要調用的代表列表。 如果一個類希望按鈕在其自身的實例上調用它的一個方法,它可以很容易地構造一個委托,該委托將在該實例上調用該方法。 請注意,為此目的使用委托意味着除了委托應該調用其方法的實例之外,還需要為委托構造堆對象。

另一種方法是使用方法NotifyOfButtonClick()定義接口INotifyOfButtonClick ,並讓按鈕控件保留一個INotifyButtonClick列表。 單擊該按鈕時,它將在每個實例上調用NotifyOfButtonClick() 如果表單只有一個使用該接口的按鈕,或者所有這些按鈕使用相同的方法,則表單可以實現INotifyOfButtonClick()本身,並將自身添加到按鈕的訂閱列表,而不是必須創建一個單獨的委托來調用它的方法。 在這種方法有效的場景中,它比使用委托更有效。 如果一個表單有兩個按鈕使用相同的接口,但是想要調用不同的方法,那么事情會變得更復雜。 在這種情況下,表單需要創建一個新對象,其目的是通過調用它擁有引用的表單上的某個方法來實現INotifyOfButtonClick() 使用這樣的包裝器對象可能會產生與委托相當的性能,但沒有代理所具有的一些編譯器輔助。

順便說一句,如果Microsoft可以向每個委托添加嵌套接口IInvoke (例如Action<int>將定義接口Action<int>.IInvoke ),那么接受Action<int>被重寫為接受Action<int>.IInvoke ,那么只有一個方法將被這些委托調用的對象可以簡單地將自己傳遞給這樣的方法。 這樣的特征可以提高閉合效率。

•接口僅定義單個方法。 •需要多播功能。 •訂戶需要多次實現該接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM