On Sun, 2008-11-23 at 09:40 +0100, Hans Vercammen wrote: > On Sun, 2008-11-23 at 00:13 -0500, Yu Feng wrote: > > Hi Hans, > > > > Thanks for the reply. > > > > To avoid confusion, can we use CreationMethod and construct block to > > refer the entities? > > sure, no problem. > > > For class types I will use GObject classes and fundamental classes. > > [...] > > On Sun, 2008-11-23 at 02:47 +0100, Hans Vercammen wrote: > > > (1) You either use the classical GObject construction scheme with a > > > registered constructor function (the construct block) and GObject > > > (construct) properties as parameters. You need [CCode > > > (has_construct_function = false)] for your creation methods if you only > > > want use this. > > > > > > (2) You use the new chaining constructor functions, which are the > > > default and not limited to the classical construction scheme > > > requirements. They do break the classical GObject construction outside > > > vala, so you probably need watch out with this when these objects are > > > only created with g_object_new somewhere. You can still use a construct > > > {} block. But these blocks are triggered and chained in the g_object_new > > > call, so they don't always make much sense when using custom chained > > > constructors. > > > > Currently (1) doesn't work at least for chaining up constructors. After > > chaining up, all logic in the child creation methods are lost. The ccode > > contains some code to free GParameters. > > Agreed, standard GObject subclassing doesn't allow custom constructor or > creation method chaining. You only have one constructor function that's > usable, the construct block. The creation method should only allow > property assignments in this case as it was prior to vala 4.0. > > > And I don't think the two GObject options are mutually exclusive. I > > can(should be able to) do some logic in the creation method, set the > > G_PARAM_CONSTRUCT properties, and then do some other initialization in > > the construct block. > > They are not mutually exclusive, but if you choose to do custom logic in > the creation method, this logic is only executed when the class is final > and not when the object is constructed with g_object_new or subclassed > as in (1). Initializations in the construct block are always executed, > whether constructed with a creation method or eventually with > g_object_new. That's why you should carefully consider what to > initialize where and when. > > > For (2), I don't think if it is a real breakage to the GObject > > semantics. It is not rare that in GTK, the creation methods (_new) > > behaves completely different from g_object_new; and there should also be > > examples where class creation methods and GObjectClass->constructor were > > used simuntenaeously. > > Are you sure about this? I'm not familiar with the Gtk+ internals, but > it would be strange that the subclassing would follow a different > initialization path, compared to the creation method. > > > > > > > But then again, if you use the new scheme, you can freely switch your > > > base class to a fundamental class or a gobject one without having to > > > change anything. This also implies that I could do something like bellow > > > which is not possible with the classical GObject construction scheme: > > > > > > > Both vala 0.5.1 and trunk fails to smoothly switching the parent > > classes. if I have extra stuff in the creation methods. > > Yeah sorry, from what I understand construction chaining isn't fully > supported yet with fundamental classes. > > > > I don't think you should mix the two construction schemes to much as > > > they are essentially incompatible. GObject basically doesn't support > > > custom constructor chaining interference, so if vala wants to support > > > this (and by doing so breaking the GObject way a bit), why keep the > > > property assignment limitation? > > > > Why are they essentially incompatible? As far as I know the construct > > blocks corresponds to Klass->constructor, and they are automatically > > chained up. > > Yes, they are automatically chained, but the time of execution is very > different and you have only one construct block to use for this. > > > If you mean chaining up the CreationMethods, I still can't see any > > incompatibilities. > > > > Recall what in general a creation method should do(not specifically > > tided with GObject or Vala GType based Classes, or C++ or any > > languages). A creation method takes parameters, do some logic, allocate > > the memory for the object, and assign initial values for the properties. > > right? > > Sure, but if you look at it that way, you can't really chain the > creation methods into an object hierarchy. > > > Now let's investigate what we really mean by chaining up creation > > methods. Obviously, memory allocation should not be chained up: the > > parent class doesn't know the size of the child class. It is the logic > > and initial value assignment that are chained up. > > > > Good, now we can see two different sections in the creation methods. > > Keep this in mind. Think about implementation now. > > > > Suppose we want to chain up the the creation methods in GObject. > > g_object_new, can do two jobs: memory allocation and value assignment. > > Therefore, for chaining up, we have to call the base logic part of the > > creation methods and collect the value assignments, then invoke > > g_object_new with the collected value assignments to finish the > > semantics of a creation methods. > > I can follow your logic to enforce standard GObject construction using > properties, but I don't understand where you are going to execute your > custom creation method logic in this case. > > > Suppose we want to chain up the creation methods in fundamental classes. > > We have a function g_type_instance_new, for the memory allocation. > > Therefore, we can call the parent creation method's logic and the value > > assignment part to do the chain up. > > > > Yes we can now see at the implementation level, creation methods for > > GObject are incompatible with those for GType based vala classes. But > > vala compiler should be able to hide these details from the end users, > > right? > > Sorry, I've lost it a bit. Fundamental classes are not bound to the > GObject property construction mechanism, so chaining these creation > methods shouldn't be a problem at all. It's the GObject constructor > chaining that's the problem, which is also why (as I understand it) > there are two construction mechanisms for it. > > > > As a consequence, I also consider it to be a great performance > > > enhancement not having to use GParameters and construct properties. The > > > GObject constructor function only takes construct properties, the others > > > are filtered out in the gobject core. So I think you would have to use > > > construct properties by default in this case, which again is very slow. > > > > non G_PARAM_CONSTRUCT properties should not even be thought as > > properties in a CreationMethod. G_PARAM_CONSTRUCT properties, to me > > serves mainly for read-only properties initialized at the object > > creation. > > > > eg: > > > > class A :Object{ > > public int val {get; construct;} > > public int lav {get; set;} > > public A.with_val(int val) { > > this.val = val; > > this.lav = val; > > } > > } > > > > val should be initialized with g_object_new, where as the line > > containing lav should be treated as the logic of the creation method, > > and compiled as regular vala statements -- to a_set_lav(self, val); > > Still, I think we are talking about different things here.
> The new > constructor chaining for GObject based classes allows you to do much > more than what is enforced by the standard GObject mechanisms. The new CreationMethod chaining? > It's more > an additional initialization layer on top of the GObject construction > mechanism. You are no longer required to use properties for constructor > arguments, (That's the CreationMethod. ) > as vala provides you a custom construct (initialization) > function for this which can be easily chained up. I agree with you. I merely hope my suggestions are useful; if the problem is solved, I'll be happy no matter my wills are expressed or not: I really need a elegant chaining up for the DOM project. Regards, Yu > > Hans > _______________________________________________ Vala-list mailing list Vala-list@gnome.org http://mail.gnome.org/mailman/listinfo/vala-list