Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 什么是委托?_Oop_Delegates - Fatal编程技术网

Oop 什么是委托?

Oop 什么是委托?,oop,delegates,Oop,Delegates,我很困惑,代表的实际角色是什么 这个问题在我的面试中被问了很多次,但我认为面试官对我的回答并不满意 有谁能用一句话和一个实际例子告诉我最好的定义吗?我喜欢把委托看作是“指向函数的指针”。这可以追溯到C时代,但这个想法仍然成立 其思想是,您需要能够调用一段代码,但要调用的代码直到运行时才知道。因此,您使用“委托”来实现此目的。代理对于事件处理程序之类的事情很方便,例如,您可以根据不同的事件执行不同的操作 有关C#的参考资料,您可以查看: 例如,在C#中,假设我们有一个我们想做的计算,我们想使用一个

我很困惑,代表的实际角色是什么

这个问题在我的面试中被问了很多次,但我认为面试官对我的回答并不满意


有谁能用一句话和一个实际例子告诉我最好的定义吗?

我喜欢把委托看作是“指向函数的指针”。这可以追溯到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);
}
我们可以这样声明代理签名:

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);
}
然后我们可以声明一个将委托作为参数的方法,如下所示:

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调用该方法

一些要演示的代码(从内存中编写,因此语法可能会关闭)


将委托看作是命令模式的简化实现。

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

或者,作为一个简单的伪示例:某物向object1发送请求。object1然后将请求及其自身转发给object2——委托。object2处理请求并执行一些工作。(注意:上面的链接提供了很好的示例)

虽然委托不是真正的“函数指针”,但它可能看起来像PHP这样的动态语言:



$func = 'foo';
$func();

function foo() {
    print 'foo';
}
或者在JavaScript中,您可以执行以下操作:


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

在Google Collections类(还有Decorator模式)中可以找到委托模式的一个很好的解释和实际实现。

事件通信发送者不知道哪个对象将处理事件。 委托是保存方法引用的类型。 委托具有签名并持有对与其签名匹配的方法的引用 所以委托就像类型安全的函数指针

button1.Click+=新建系统.EventHandler(button1\u Click) System.EventHandler在此处声明为委托 在.net中,事件处理委托的概念(如按钮单击)

当您不知道在运行时调用哪个代码时,将使用委托 所以在那个时候,委托被用来处理事件


委托是指将任务委托给的对象。委派的主要目的是分离代码,并允许更大的灵活性和重用

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

简单的例子:

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()
类型不是具体的,而是抽象的,因为它是一个接口。在Java世界中,这通常在服务范例中表示,在服务范例中,您调用一个服务(一个通过特定接口将自身作为服务进行广告的对象),然后该服务调用委托来帮助它完成工作。该服务的方法被命名为粗粒度任务(makePayment()、createNewUser()等),而在内部,它通过委托进行大量工作,委托类型是接口,而不是具体实现

SomeService
{
    SomeInterface someImplementation = ... // assign here
    SomeOtherInterface someOtherImplementation = ... // okay, let's add a second

    public void doSomeWork()
    {
         someImplementation.doSomething();
         someOtherImplementation.doSomethingElse();
    }
}

(注意:如何分配实现超出了此线程的范围。查找控制反转和依赖项注入。)

委托是可以引用方法的对象。因此,当我们创建委托时,我们正在创建一个对象,该对象可以保存对方法的引用。此外,可以通过该引用调用该方法。因此,委托可以调用它引用的方法。 委托的主要优点是,它允许我们指定对方法的调用,但实际调用的方法是在运行时确定的,而不是在编译时确定的

简单委托

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

这里我将解释委托、多播委托及其用法。。 委托是在对象中保存方法引用的类型。它也称为类型安全函数指针。我们可以说委托是一种定义方法签名的类型

实例化委托时,可以将其实例与具有兼容签名的任何方法相关联。您可以通过委托实例调用(或调用)该方法。 委托用于将方法作为参数传递给其他方法。 事件处理程序只是通过委托调用的方法。 使用代理的优点是, 封装来自调用方的方法调用 委托的有效使用提高了应用程序的性能