2010-03-17 26 views
7

Qual è lo schema del "dispatcher" e come lo implementerei nel codice?Qual è lo schema di progettazione "Dispatcher"?

Ho un pacchetto di proprietà di oggetti generici e desidero che il recupero sia delegato a un metodo generico.

Attualmente, ho delle proprietà che cercano una chiave specifica nella borsa. Per esempio:

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

È stato suggerito che questo potrebbe essere più generico con il modello "dispatcher", ma sono stato in grado di trovare una buona descrizione o un esempio.

Sto cercando un modo più generico per gestire il deposito/recupero della proprietà.

risposta

8

io non sono sicuro di aver capito bene la tua domanda, ma ...

Ho un elenco di proprietà di oggetti generici e vorrei avere il recupero delegato a un metodo generico.

... sembra che tu stia cercando informazioni sul "doppio dispacciamento"?

Immaginate di avere tre classi:

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

E due metodi per fare qualcosa con oggetti di tipo B e C:

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

Il problema è che quando hai a disposizione solo una variabile di statico tipo A ...:

A a = new B(); 

... non è possibile chiamare DoSomething (a) perché in fase di compilazione solo il suo tipo statico (A) è noto, quindi il compilatore non può decidere se chiamare il metodo DoSomething (B obj) o DoSomething (C obj).

Questo è il doppio dispacciamento. Alcune lingue lo supportano, altri come C++, C# e Java no. Ma puoi implementarlo anche tu in queste lingue. Per un esempio vedere:

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

E:

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

+1

il primo articolo wikipedia Stati 'in C#, la spedizione multipla possono essere raggiunti senza che impiega il modello visitatore. Questo viene fatto semplicemente lanciando l'oggetto passato a dinamico ' –

Problemi correlati