On Wed, 2009-09-30 at 19:46 +0200, Jan Hudec wrote:
> On Wed, Sep 30, 2009 at 18:58:54 +0200, Philipp Zabel wrote:
> > I'd like to subclass GLib.BufferedInputStream.
> > Vala doesn't like the following construct:
> > 
> > class MyStream : GLib.BufferedInputStream {
> >     MyStream (GLib.InputStream base_stream) {
> >         base (base_stream);
> >     }
> > }
> > 
> > $ valac mystream.vala --pkg gio-2.0
> > mystream.vala:3.3-3.20: error: chain up to
> > `GLib.BufferedInputStream..new' not supported
> >         base (base_stream);
> >         ^^^^^^^^^^^^^^^^^^
> > Compilation failed: 1 error(s), 0 warning(s)
> > 
> > Am I doing it wrong? BufferedInputStream has a constructor that takes
> > one GLib.InputStream.
> 
> Short story:
> ------------
> 
>     MyStream (GLib.InputStream _base_stream) {
>       base_stream = _base_stream;
>     }
> 
> Long story:
> -----------
> 
> The thing with constructors in vala is a bit complicated, because the GObject
> type system is a bit strange. They are not really to blame, they did it for
> convenience of use from C.
> 
> The "constructor" you see is so called construction method. It allocates and
> initializes the object in one operation, so it cannot be used for allocating
> a subclass.
> 
> For vala defined classes, the compiler generates an additional function for
> each construction method, that takes id of the type to allocate as additional
> parameter, so it can be used for the constructor chaining, but the classes in
> glib don't have such functions.
> 
> However, each GObject-derived class can be allocated without using the new or
> construct function and in fact it is how the construct function eventually
> allocates the object -- via g_object_new. That will gather all construct
> properties and call an instance_init function for the object.
> 
> The GLib.BufferedInputStream class inherits a construct-only property
> "base-stream" (written with underscore as identifier) from it's
> GLib.FilteredInputStream base class. The construction method just sets that
> property and invokes the object allocator. You just need to do the same.
> 
> Note, that in your class, you can have a 'construct { ... }' block. The code
> there is placed into the init_instance, which makes it called as part of
> every construction method. It will be called even if your object gets
> manually constructed by GLib.Object.new, in which case none of the
> construction methods will.

Wow .. that hurts !
Does that mean that sbuclassing a non-Vala GObject is different from
subclassing a Vala one ?
Is there a wiki page describing this clearly for simple minds like me ?

Thanks,
        Xav



_______________________________________________
Vala-list mailing list
Vala-list@gnome.org
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to