Axel,
I believe that when you're inheriting from a C class in Vala code, calling
the base class's constructor is not supported [1]. Instead, just replicate
the original constructor's functionality at the beginning of your derived
class's constructor:
public class FolderView : Fm.FolderView, BaseView
{
public FolderView()
{
// initialize Fm.FolderView's properties
fmFoldViewProp1 = "foo";
...
// do FolderView-specific initialization
foldViewProp1 = "bar";
}
}
- Kerrick
[1]
As far as I understand it, this is because the C constructors
(e.g. fm_folder_view_new) do two logically separate things:
1) allocate memory for the new object
2) initialize the fields comprising that memory
Since (in general) a derived object occupies more memory than the
corresponding base object, the base constructor generally doesn't allocate
enough memory at step (1), and so the object returned by the base
constructor is pretty much useless (unless the derived constructor wants to
call realloc, but that would incur a performance penalty). Instead, each
constructor has to duplicate the functionality of its parent constructor.
In Vala, they handled this problem a little more nicely, and so constructor
chaining works as expected, but again this only works if you're inheriting
from a Vala class.
This discussion has more information:
http://osdir.com/ml/vala-list/2009-09/msg00376.html
On Sun, May 27, 2012 at 6:51 AM, Axel FILMORE <[email protected]>wrote:
> Hi there,
>
> to avoid some nasty duplicated code I try to use inheritance with a base
> abstract class and derived views.
>
> I need to create a terminal view and a folder view, while it works fine
> with my terminal view which is written in Vala, I've some troubles with the
> folder view which is C code. :(
>
> I have the following :
>
> namespace Manager {
>
> public class FolderView : Fm.FolderView, BaseView {
>
> construct {
> base.new (Fm.FolderViewMode.LIST_VIEW);
> //Object ();
> //base (Fm.FolderViewMode.LIST_VIEW);
> }
>
> public FolderView () {
> //Object (mode: Fm.FolderViewMode.LIST_VIEW);
> //base (Fm.FolderViewMode.LIST_VIEW);
>
> base.new (Fm.FolderViewMode.LIST_VIEW);
> }
> }
> }
>
> I tried a few things without much success, the problem is that the base
> object doesn't seem to be created.
>
> BaseView is an abstract class in Vala and Fm.FolderView is my base object
> in C, the one that gives my some troubles. :-P
>
> In my Vapi file for the base object, I have :
>
> [CCode (cheader_filename = "gtk/fm-folder-view.h")]
> public class FolderView : Gtk.ScrolledWindow,
> Atk.Implementor,
> Gtk.Buildable {
>
> public Fm.FolderViewMode mode;
>
> [CCode (has_construct_function = false,
> cname = "fm_folder_view_new",
> type = "GtkWidget*")]
>
> public FolderView (int mode);
>
> }
>
>
> The problem is that the new function (fm_folder_view_new) is not called
> from Vala code.
>
> I tried to use "Object (mode: Fm.FolderViewMode.LIST_VIEW);"
> but "mode" is not a property and it fails.
>
> Is there a way so that when doing var = new Manager.FolderView ();
> the base function "fm_folder_view_new" is called ?
>
> Thanks. :)
>
>
> --
> Axel FILMORE
> #-----------------------------**---------------#
> https://github.com/afilmore
> #-----------------------------**---------------#
> Vala - Compiler For The GObject Type System
> https://live.gnome.org/Vala
> #-----------------------------**---------------#
> ______________________________**_________________
> vala-list mailing list
> [email protected]
> https://mail.gnome.org/**mailman/listinfo/vala-list<https://mail.gnome.org/mailman/listinfo/vala-list>
>
_______________________________________________
vala-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/vala-list