2010-03-17 125 views
7

什麼是「調度程序」模式,以及如何在代碼中實現它?什麼是「調度員」設計模式?

我有一個屬性包的通用對象,並希望將檢索委託給一個通用的方法。

目前,我有屬性尋找包中的特定鍵。例如:

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

有人提出,這可能是與「調度」模式更通用的,但我一直無法找到一個很好的說明或示例。

我正在尋找更通用的方式來處理物業包存儲/檢索。

回答

8

我不知道我正確理解你的問題,但是...

我有一個通用對象屬性包,並想有委託給一個通用的方法進行檢索。

...聽起來你正在尋找關於「雙重調度」的信息嗎?

想象一下,你有三類:

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

和兩個方法做B型的對象和C的東西:

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

的問題是,當你已經是一個變量靜態Ⅰ型:

A a = new B(); 

...你不能調用DoSomething的(一),因爲在編譯時只它的靜態類型(A)是已知的,所以編譯器不能決定是否應該調用方法DoSomething(B obj)或DoSomething(C obj)。

這是雙派調度的地方。有些語言支持開箱即用,其他類似C++,C#和Java的則不支持。但是你也可以用這些語言自己實現它。舉一個例子,請參閱:

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

和:

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

+1

第一個維基百科的文章各國在C#中,多分派可以不使用訪問者模式來實現。這是通過簡單地將傳遞的對象轉換爲動態的' – 2016-07-13 09:21:37