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)
这里我将解释委托、多播委托及其用法。。 委托是在对象中保存方法引用的类型。它也称为类型安全函数指针。我们可以说委托是一种定义方法签名的类型 实例化委托时,可以将其实例与具有兼容签名的任何方法相关联。您可以通过委托实例调用(或调用)该方法。 委托用于将方法作为参数传递给其他方法。 事件处理程序只是通过委托调用的方法。 使用代理的优点是, 封装来自调用方的方法调用 委托的有效使用提高了应用程序的性能