2015-04-26 2 views
2

Je suis nouveau à Vala et jusqu'à présent je pense que c'est plutôt cool mais j'ai du mal à comprendre l'héritage. J'ai lu here que je devrais utiliser base() pour appeler le constructeur des parents. D'accord, cool, semble compréhensible mais ça ne marche pas pour moi. J'ai continué à obtenir l'erreur sur le titre. Voici mon extrait pour montrer:Chaîne jusqu'à 'Gtk.Box.new' pas pris en charge

public class MyBox : Gtk.Box { 
    public MyBox(Gtk.Orientation orientation, int spacing) { 
     // I have to this 
     this.set_orientation(orientation); 
     this.set_spacing(spacing); 
     // I want to do this: 
     base(orientation, spacing); 
     //workaround is this: 
     Object(orientation: orientation, spacing: spacing); 
    } 
} 

S'il vous plaît aider à comprendre pourquoi Object (....) fonctionne mais pas la base (...)

devrait-il pas être la même chose?

Répondre

3

Ceci est dû à la mise en œuvre du code C. Lorsque Vala génère un constructeur, il génère deux fonctions C: une fonction _new qui alloue de la mémoire et appelle la fonction _construct et une fonction _construct qui initialise l'objet. Lorsque vous appliquez le constructeur de base à l'aide de base(), vous devez appeler la fonction _construct correspondante. Toutes les classes écrites en C ne l'ont pas; Dans le fichier VAPI, vous trouverez has_construct_function = false pour certains constructeurs. Si tel est le cas, aucun chaînage ne peut être effectué. La base GObject peut définir des propriétés à partir d'arguments, ce qui devient le seul moyen de définir des valeurs par défaut dans la classe de base.

+0

C'était une explication parfaite. Donc, chaque fois que je reçois une erreur de chaîne, ce serait ** seulement ** moyen de le résoudre? – RandomGuy

+0

Oui. Dans le cas de ces constructeurs, les paramètres sont les mêmes que de les passer par le nom au constructeur 'Object', donc il ne manque aucune fonctionnalité. – apmasell