何时使用代理而不是接口

时间:2012-06-26 09:42:28

标签: c# interface delegates

根据这个article,它说:

  

在以下情况下使用代理:

     
      
  • 一个类可能需要多个方法的实现。
  •   
     

在以下情况下使用界面:

     
      
  • 一个类只需要一个方法实现。
  •   

有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:6)

那是......奇怪而令人困惑。如果您只需要方法的一个实现... 使用方法(可能是虚方法)。与接口一样,委托的 point 的一部分是您可以替换多个不同的实现。

如果我不得不总结一下:

  

委托类型非常类似于只暴露单个方法的接口,而委托实例非常类似于实现该接口的类的实例 - 只是很多编译器的性感使它很容易编写,即x => 2 * x,没有(有时)需要实例。

代理人还有一些其他有用的技巧,面向events(多播等),但这听起来与文章的背景无关。

答案 1 :(得分:5)

  

一个类可能需要多个方法的实现。

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;
   }
}

在上面的示例中,只有接口公开的方法的单个实现。

答案 2 :(得分:1)

在我的简单头脑中,这与ICompare / IComparable非常相似。

接口的实现意味着行为是实现类固有的。行为不会根据呼叫者或呼叫情况而改变。

代理人说该操作不是类固有的,而是基于上下文或要定义的调用者。

答案 3 :(得分:0)

这个措辞似乎有点令人困惑,但可能会举例说明。假设有人正在设计一个按钮控件,希望在单击时提供通知。通常的做法是按钮维护要调用的代表列表。如果一个类希望按钮在其自身的实例上调用它的一个方法,它可以很容易地构造一个委托,该委托将在该实例上调用该方法。请注意,为此目的使用委托意味着除了委托应该调用其方法的实例之外,还需要为委托构造堆对象。

另一种方法是使用方法INotifyOfButtonClick定义接口NotifyOfButtonClick(),并让按钮控件保留INotifyButtonClick列表。单击该按钮时,它将在每个实例上调用NotifyOfButtonClick()。如果表单只有一个使用该接口的按钮,或者所有这些按钮使用相同的方法,则表单可以实现INotifyOfButtonClick()本身,并将其自身添加到按钮的订阅列表中,而不是必须创建一个单独的委托来调用其方法。在这种方法有效的场景中,它比使用委托更有效。如果一个表单有两个按钮使用相同的接口,但是想要调用不同的方法,那么事情会变得更复杂。在这种情况下,表单必须创建一个新对象,其目的是通过调用它拥有引用的表单上的某个方法来实现INotifyOfButtonClick()。使用这样的包装器对象可能会产生与委托相当的性能,但没有代理所具有的一些编译器辅助。

BTW,如果Microsoft可以向每个委托添加嵌套接口IInvoke(例如Action<int>将定义接口Action<int>.IInvoke),那么如果接受Action<int>的方法被重写为接受Action<int>.IInvoke,然后只有一个方法将被这些委托调用的对象可以简单地将自己传递给这样的方法。这样的功能可以提高封闭效率。

答案 4 :(得分:0)

•界面仅定义一种方法。 •需要多播功能。 •订户需要多次实现该接口。