Implementing interfaces: GObject Reference Manual

## Implementing interfaces

Once the interface is defined, implementing it is rather trivial.

The first step is to define a normal final GObject class exactly as in the section called “Boilerplate header code”.

The second step is to implement MamanBaz by defining it using `G_DEFINE_TYPE_WITH_CODE` and `G_IMPLEMENT_INTERFACE` instead of `G_DEFINE_TYPE`:

    1
    2
    3
    4
    5
    static void maman_ibaz_interface_init (MamanIbazInterface *iface);

    G_DEFINE_TYPE_WITH_CODE (MamanBar, maman_bar, G_TYPE_OBJECT,
                             G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ,
                                                    maman_ibaz_interface_init))

This definition is very much like all the similar functions seen previously. The only interface-specific code present here is the use of `G_IMPLEMENT_INTERFACE`.

Classes can implement multiple interfaces by using multiple calls to `G_IMPLEMENT_INTERFACE` inside the call to `G_DEFINE_TYPE_WITH_CODE`

`maman_baz_interface_init`, the interface initialization function: inside it every virtual method of the interface must be assigned to its implementation:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    static void
    maman_baz_do_action (MamanBaz *self)
    {
      g_print ("Baz implementation of Ibaz interface Action: 0x%x.\n",
               self->instance_member);
    }

    static void
    maman_baz_do_something (MamanBaz *self)
    {
      g_print ("Baz implementation of Ibaz interface Something: 0x%x.\n",
               self->instance_member);
    }

    static void
    maman_ibaz_interface_init (MamanIbazInterface *iface)
    {
      iface->do_action = maman_baz_do_action;
      iface->do_something = maman_baz_do_something;
    }

    static void
    maman_baz_init (MamanBaz *self)
    {
      self->instance_member = 0xdeadbeef;
    }