c# - 什么是 "Dispatcher"设计模式?

标签 c# .net design-patterns generics

什么是“调度程序”模式,我将如何在代码中实现它?

我有一个通用对象的属性包,希望将检索委托(delegate)给一个通用方法。

目前,我正在寻找包中的特定 key 。例如:

private Dictionary<String, Object> Foo { get; set; }
private const String WidgetKey = "WIDGETKEY";

public Widget? WidgetItem
{
    get
    {
        return Foo.ContainsKey(WidgetKey) ? Foo[WidgetKey] as Widget: null;
    }
    set
    {
        if (Foo.ContainsKey(WidgetKey))
            Foo[WidgetKey] = value;
        else
            Foo.Add(WidgetKey, value);
    }
}

有人建议这对于“调度程序”模式可能更通用,但我一直无法找到好的描述或示例。

我正在寻找一种更通用的方法来处理属性包存储/检索。

最佳答案

我不确定我是否正确理解了您的问题,但是...

I have a property bag of generic objects and would like to have the retrieval delegated to a generic method.

...听起来您正在寻找有关“双重调度”的信息?

假设您有三个类:

abstract class A {}
class B extends A {}
class C extends A {}

还有两种方法可以处理 B 和 C 类型的对象:

void DoSomething(B obj) {}
void DoSomething(C obj) {}

问题是,当您只有一个静态类型 A 的变量时...:

A a = new B();

...你不能调用 DoSomething(a) 因为在编译时只有它的静态类型 (A) 是已知的,所以编译器不能决定它是否应该调用方法 DoSomething(B obj) 或 DoSomething(C obj)。

这就是双重分派(dispatch)的用武之地。有些语言开箱即用地支持它,而 C++、C# 和 Java 等其他语言则不支持。但是您也可以使用这些语言自己实现它。有关示例,请参见:

http://en.wikipedia.org/wiki/Double_dispatch

和:

http://en.wikipedia.org/wiki/Visitor_pattern

关于c# - 什么是 "Dispatcher"设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465521/

相关文章:

c# - c# 中是否有等效于 php array_merge 的函数

java - 目标平台预先确定后,如何消除JIT的需要?

c# - 根据旋转的文本框旋转光标

c# - 日期时间格式 yyyy-MM-ddT00 :00:00

design-patterns - 什么是 Facet 设计模式?

c# - 无法连接到已配置的开发 Web 服务器

c# - 所有音频频率

c# - 以强类型方式使用对象的属性名称

.Net 设计模式,用于存储和检索每个用户的敏感数据

java - 具有单例模式和静态方法和变量的多个子类