Re: Best practise inheritance



Hi

No, you can talk in C of direct inheritance. Or implementing an interface.

As Tristan told you. The struct contains the other struct as not using
a pointer.

struct MyCompositeWidget
{
  GtkAlignment alignment;

  GtkBox *box;
};

The properties are inherited, too. As long you use
g_type_register_static() or alike
passing the parent type. You can peek the parent class.

It might hard to understand for you what has the meaning class. A
class has always
the very same methods. Else you have to subtype and override the class.

The class methods can chained up by using the peeked class.

GTK_WIDGET_CLASS(my_composite_widget_parent_class)->show(my_instance)

Note GLib-Object interfaces are limited to one nesting level of GTypeInterface.

So there is no interface inheritance.

I think it's a good point to do object orientated programming with C
because you have to
know what's going on.

Bests,
Joël


On Mon, Mar 20, 2017 at 5:15 PM, Tristan Van Berkom
<tristan vanberkom codethink co uk> wrote:
On Mon, 2017-03-20 at 16:36 +0100, S. Jacobi wrote:
First of all, inheritance may be the wrong word here in plain c, but
I
don't know how else to name it.

Sorry replied to this from my phone and missed some things...

In different projects I see different approaches how to derive custom
widgets from existing ones. I can roughly group them into 2 to 3.

1) The header only has a typedef to make the struct opaque. All
variables needed are put into the struct in the .c file.

myType.h
typedef struct _MyType        MyType;

myType.c
struct _MyType
{
  GtkWidget   *parent;
  /* additions */
  guint                i;
  ...
};

Note also that this approach imposes that absolutely nothing can derive
from MyType later, because MyType becomes anonymous.


2a) The header defines a private struct, and all variables needed are
put into this private struct.

myType.h
typedef struct _MyTypePriv MyTypePriv;
typedef struct _MyType           MyType;

myType.c
struct _MyTypePriv
{
  GtkWidget   *parent;
  /* additions */
  guint                i;
};

struct _MyType
{
  MyTypePriv  *priv;
};

Actually this approach (2a) I've never seen before, not a good idea,
but possibly works (except for the other detail below)...


2b) Similar to 2a, but the parent is put in the "main" struct, not
the
private part.

myType.h
typedef struct _MyTypePriv MyTypePriv;
typedef struct _MyType           MyType;

myType.c
struct _MyTypePriv
{
  /* additions */
  guint                i;
};

struct _MyType
{
  GtkWidget   *parent
  MyTypePriv  *priv;
};

So in all of these cases, you have missed an important detail:

struct _MyType {
    GtkWidget *parent_instance;

    ... anything else...
}

Is wrong, as it will only reserve one pointer size for the parent
structure, what you have been seeing is always in fact:

struct _MyType {
    GtkWidget parent_instance

    ... anything else ...
}

The parent instance must be known and not anonymous, you need to
include the struct itself as the first member of your derived type, not
merely a pointer to that.

Cheers,
    -Tristan

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]