2011-05-26 15 views
6

Estoy tratando de llenar un Libgee HashMap donde cada entrada tiene una cadena como clave y una función como valor. es posible? Quiero que este tipo de cosas:Gee HashMap que contiene métodos como valores

var keybindings = new Gee.HashMap<string, function>(); 
keybindings.set ("<control>h", this.show_help()); 
keybindings.set ("<control>q", this.explode()); 

de modo que con el tiempo puede hacer algo como esto:

foreach (var entry in keybindings.entries) { 
    uint key_code; 
    Gdk.ModifierType accelerator_mods; 
    Gtk.accelerator_parse((string) entry.key, out key_code, out accelerator_mods);  
    accel_group.connect(key_code, accelerator_mods, Gtk.AccelFlags.VISIBLE, entry.value); 
} 

Pero tal vez esta no es la mejor manera?

Respuesta

5

Los delegados son lo que estás buscando. Pero la última vez que lo comprobé, los genéricos no apoyaron delegados, por lo que una forma no tan elegante es envolverlo:

delegate void DelegateType(); 

private class DelegateWrapper { 
    public DelegateType d; 
    public DelegateWrapper(DelegateType d) { 
     this.d = d; 
    } 
} 

Gee.HashMap keybindings = new Gee.HashMap<string, DelegateWrapper>(); 
keybindings.set ("<control>h", new DelegateWrapper(this.show_help)); 
keybindings.set ("<control>q", new DelegateWrapper(this.explode)); 

//then connect like you normally would do: 
accel_group.connect(entry.value.d); 
+0

Creo que se implementan genéricos, o al menos hay una sección relacionada con ellos en el [tutorial] (http://live.gnome.org/Vala/Tutorial#Generics) – Riazm

+0

Quise decir 'usar delegados como el tipo genérico argumento 'no es compatible, no genéricos en general :) Editado. – takoi

2

Es posible sólo para los delegados con [ccode (has_target = false)], de lo contrario tienes que crear un contenedor como sugirió Takoi.

Cuestiones relacionadas