什么是代表?

我很困惑,代表的实际angular色是什么? 我在面试中多次被问到这个问题,但我不认为面试官对我的回答满意。

任何人都可以用一个实际的例子用一句话告诉我最好的定义吗?

谢谢

我喜欢把代表想象成“指向函数的指针”。 这回到C日,但这个想法仍然成立。

这个想法是,你需要能够调用一段代码,但是你要调用的那段代码在运行之前是不知道的。 所以你使用一个“代表”的目的。 例如,代表们可以派上用场,比如事件处理程序等,根据不同的事件做不同的事情。

这里是 C#的参考,你可以看看:

例如,在C#中,假设我们有一个计算,我们想要使用一个不同的计算方法,我们直到运行时才知道。 所以我们可能有几个像这样的计算方法:

public static double CalcTotalMethod1(double amt) { return amt * .014; } public static double CalcTotalMethod2(double amt) { return amt * .056 + 42.43; } 

我们可以像这样声明一个委托签名:

 public delegate double calcTotalDelegate(double amt); 

然后我们可以声明一个方法,把这个委托作为一个参数,如下所示:

 public static double CalcMyTotal(double amt, calcTotalDelegate calcTotal) { return calcTotal(amt); } 

我们可以调用CalcMyTotal方法传入我们想要使用的委托方法。

 double tot1 = CalcMyTotal(100.34, CalcTotalMethod1); double tot2 = CalcMyTotal(100.34, CalcTotalMethod2); Console.WriteLine(tot1); Console.WriteLine(tot2); 

委托只是一个函数指针。
简单地把你分配你想要运行你的委托的方法。 然后在代码中,您可以通过Invoke调用该方法。

一些代码来演示(从内存中写这样的语法可能会closures)

 delegate void delMyDelegate(object o); private void MethodToExecute1(object o) { // do something with object } private void MethodToExecute2(object o) { // do something else with object } private void DoSomethingToList(delMyDelegate methodToRun) { foreach(object o in myList) methodToRun.Invoke(o); } public void ApplyMethodsToList() { DoSomethingToList(MethodToExecute1); DoSomethingToList(MethodToExecute2); } 

从这里采取

什么是代表?
A当对象接收到请求时,对象可以自己处理请求,也可以将请求传递给第二个对象来完成工作。 如果对象决定传递请求,则表示该对象已将处理该请求的责任转交给第二个对象。

或者,作为一个简单的伪示例:有东西向object1发送请求。 object1然后将请求和自身转发给object2 – 委托。 object2处理请求并做一些工作。 (注:上面的链接给出了很好的例子)

考虑一下委托,关于命令模式的简化实现。

委托是可以引用方法的对象。 因此,当我们创build一个委托,我们正在创build一个对象,可以持有一个方法的引用。 而且,这个方法可以通过这个参考来调用。 因此,委托可以调用它引用的方法。 委托的主要优点是它允许我们指定对某个方法的调用,但实际调用的方法是在运行时确定的,而不是在编译时确定的。

简单的代表

 Declaration of delegate: delegate-modifier delegate return-type delegate-name(parameters) Implementation of delegate: Delegate-name delegate-object=new Delegate-name(method of class) 

http://knowpacific.wordpress.com/2012/01/26/delegate/

在这里,我将解释代表,多播委托及其用法。委托是一种在方法中包含方法引用的types。 它也被称为types安全函数指针。 我们可以说一个委托是一个定义方法签名的types。

当你实例化一个委托,你可以将它的实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用(或调用)该方法。 委托用于将方法作为parameter passing给其他方法。 事件处理程序只不过是通过委托来调用的方法。 使用委托的优点是,从调用者封装方法的调用有效使用委托改善了应用程序的性能用于asynchronous调用方法。 代表有一些属性

 Delegates are like C++ function pointers but are type safe. Delegates allow methods to be passed as parameters. Delegates can be used to define callback methods. Delegates can be chained together; for example, multiple methods can be called on a single event. Methods do not have to match the delegate signature exactly. 

public delegate type_of_delegate delegate_name()//声明

 You can use delegates without parameters or with parameter list If you are referring to the method with some data type then the delegate which you are declaring should be in the same format. This is why it is referred to as type safe function pointer. Here I am giving an example with String. 

以下示例显示了一个委托操作:

  namespace MyDelegate { class Program { private delegate void Show(string s); // Create a method for a delegate. public static void MyDelegateMethod(string me ssage) { System.Console.WriteLine(message); } static void Main(string[] args) { Show p = MyDelegateMethod; p("My Delegate"); p.Invoke("My Delegate"); System.Console.ReadLine(); } } } 

什么是组播代表?

这是一个代表多个方法的参考。 多播委托必须只包含返回void的方法,否则会有运行时exception。

  delegate void MyMulticastDelegate(int i, string s); Class Class2 { static void MyFirstDelegateMethod(int i, string s) { Console.WriteLine("My First Method"); } static void MySecondDelegateMethod(int i, string s) { Console.WriteLine("My Second Method"); } static void Main(string[] args) { MyMulticastDelegate Method= new MyMulticastDelegate(MyFirstDelegateMethod); Method+= new MyMulticastDelegate (MySecondDelegateMethod); Method(1,"Hi"); // Calling 2 Methodscalled Method-= new MyMulticastDelegate (MyFirstDelegateMethod); Method(2,"Hi"); //Only 2nd Method calling } } 

这里委托使用+ =运算符添加,并使用 – =运算符删除。

委托types派生自.NET Framework中的委托类。 委托types是密封的 – 它们不能派生。 因为实例化的委托是一个对象,它可以作为parameter passing,或者分配给一个属性。 这允许一个方法接受委托作为参数,稍后调用委托。 这被称为asynchronouscallback。

Delegate模式的一个很好的解释和实际的实现可以在Google Collections Forwarding Classes(也是Decorator模式)中find。

在事件通信中,发件人不知道哪个对象将处理事件。 代表是方法的参考的types。 委托具有签名并持有与其签名匹配的方法的引用,所以委托就像types安全函数指针。

button1.Click + = new System.EventHandler(button1_Click)System.EventHandler被声明为一个委托在这里.net事件工作的委托的概念(如button点击)

如果在运行时不知道要调用哪个代码,则使用Delegate所以在那个时候Delegate被用来处理事件

http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

委托对象是另一个对象在该对象发生某事时所咨询的对象。 例如,如果您的汽车出现问题,您的维修人员就是您的代表。 你去找你的维修人员,让他为你修理汽车(尽pipe有些人更喜欢自己修理汽车,在这种情况下,他们是他们自己的汽车的代表)。

委托是表示指向函数的指针的对象。 但是,它不是一个普通的函数指针,它是:

1)是面向对象的

2)是types安全的,即它只能指向一个方法,你不能读取它指向的原始内存地址

3)强types。 它只能指向匹配其签名的方法。

4)可以同时指向多个方法。

虽然不是一个“函数指针”,但委托可能看起来像一个dynamic语言,如PHP:

$func = 'foo'; $func(); function foo() { print 'foo'; }
$func = 'foo'; $func(); function foo() { print 'foo'; } 

或在JavaScript中,你可以做一些事情:

var func = function(){ alert('foo!'); } func();
var func = function(){ alert('foo!'); } func(); 

委托是委托任务的事物。 授权的主要目的是分离代码,并允许更大的灵活性和重用。

在编程方面,特别是面向对象的编程,这意味着当一个方法被调用来做一些工作时,它将工作传递给它所引用的另一个对象的方法。 只要对象符合一组预定义的方法,引用就可以指向我们希望的任何对象。 我们称之为“编程接口”(与具体的类实现编程)。 一个接口基本上是一个通用的模板,没有实现; 它只是一个配方,一套方法,先决条件和后置条件(规则)。

简单的例子:

 SomeInterface { public void doSomething(); } SomeImplementation implements SomeInterface { public void doSomething() { System.err.println("Was it good for you?"); } } SomeCaller { public void doIt(SomeInterface someInterface) { someInterface.doSomething(); } } 

现在,您可以随时使用任何我想要的实现,而无需更改SomeCaller中的代码,因为doIt()传递的types不是具体的,而是抽象的,因为它是一个接口。 在Java世界中,这通常表示在服务范例中,在该范例中,您向服务发出呼叫(对象通过特定的接口将其本身宣告为服务),然后服务会呼叫代表以帮助其工作。 这个服务的方法被命名为粗粒度的任务(makePayment(),createNewUser()等),而在内部它通过委托来完成大量的工作,委托的types是接口而不是具体的实现。

 SomeService { SomeInterface someImplementation = ... // assign here SomeOtherInterface someOtherImplementation = ... // okay, let's add a second public void doSomeWork() { someImplementation.doSomething(); someOtherImplementation.doSomethingElse(); } } 

(注意:实现如何被分配超出了这个线程的范围,查找控制和dependency injection的反转。

代表主要用于事件。

需要的是:

您不想在运行程序时执行一段代码。 运行程序之后,每当发生事件时,都要执行这段代码。

例如:

  1. 控制台应用程序 – 代码只能在运行程序时执行。 (写在主要方法)
  2. Windows应用程序 (用户界面编程) – 运行程序后单击button时可以执行代码。

这就是他们所说的,你不知道在编译的时候会调用哪个方法。 你只知道在运行时点击button。

没有代表没有用户界面编程是可能的。 因为您正在执行代码,只要用户点击button,键入文本框,select下拉列表项目等….