| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>How To define implement an Interface?</title> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> |
| <link rel="home" href="index.html" title="GObject Reference Manual"> |
| <link rel="up" href="howto-interface.html" title="How to define and implement interfaces"> |
| <link rel="prev" href="howto-interface.html" title="How to define and implement interfaces"> |
| <link rel="next" href="ch06s03.html" title="Interface definition prerequisites"> |
| <meta name="generator" content="GTK-Doc V1.14 (XML mode)"> |
| <link rel="stylesheet" href="style.css" type="text/css"> |
| </head> |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"> |
| <td><a accesskey="p" href="howto-interface.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td> |
| <td><a accesskey="u" href="howto-interface.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td> |
| <td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td> |
| <th width="100%" align="center">GObject Reference Manual</th> |
| <td><a accesskey="n" href="ch06s03.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td> |
| </tr></table> |
| <div class="sect1" title="How To define implement an Interface?"> |
| <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| <a name="howto-interface-implement"></a>How To define implement an Interface?</h2></div></div></div> |
| <p> |
| Once the interface is defined, implementing it is rather trivial. |
| </p> |
| <p> |
| The first step is to define a normal GObject class, like: |
| </p> |
| <pre class="programlisting"> |
| #ifndef __MAMAN_BAZ_H__ |
| #define __MAMAN_BAZ_H__ |
| |
| #include <glib-object.h> |
| |
| #define MAMAN_TYPE_BAZ (maman_baz_get_type ()) |
| #define MAMAN_BAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, Mamanbaz)) |
| #define MAMAN_IS_BAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ)) |
| #define MAMAN_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAZ, MamanbazClass)) |
| #define MAMAN_IS_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAZ)) |
| #define MAMAN_BAZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAZ, MamanbazClass)) |
| |
| |
| typedef struct _MamanBaz MamanBaz; |
| typedef struct _MamanBazClass MamanBazClass; |
| |
| struct _MamanBaz |
| { |
| GObject parent_instance; |
| |
| int instance_member; |
| }; |
| |
| struct _MamanBazClass |
| { |
| GObjectClass parent_class; |
| }; |
| |
| GType maman_baz_get_type (void); |
| |
| #endif /* __MAMAN_BAZ_H__ */ |
| </pre> |
| <p> |
| There is clearly nothing specifically weird or scary about this header: |
| it does not define any weird API or derives from a weird type. |
| </p> |
| <p> |
| The second step is to implement <span class="type">MamanBaz</span> by defining |
| its GType. Instead of using <code class="function">G_DEFINE_TYPE</code> we |
| use <code class="function">G_DEFINE_TYPE_WITH_CODE</code> and the |
| <code class="function">G_IMPLEMENT_INTERFACE</code> macros. |
| </p> |
| <pre class="programlisting"> |
| 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)); |
| </pre> |
| <p> |
| This definition is very much like all the similar functions we looked |
| at previously. The only interface-specific code present here is the call |
| to <code class="function">G_IMPLEMENT_INTERFACE</code>. |
| </p> |
| <div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"> |
| <h3 class="title">Note</h3> |
| <p>Classes can implement multiple interfaces by using multiple |
| calls to <code class="function">G_IMPLEMENT_INTERFACE</code> inside the call |
| to <code class="function">G_DEFINE_TYPE_WITH_CODE</code>.</p> |
| </div> |
| <p> |
| <code class="function">maman_baz_interface_init</code>, the interface |
| initialization function: inside it every virtual method of the interface |
| must be assigned to its implementation: |
| </p> |
| <pre class="programlisting"> |
| 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_ibaz_interface_init (MamanIbazInterface *iface) |
| { |
| iface->do_action = baz_do_action; |
| } |
| |
| static void |
| maman_baz_init (MamanBaz *self) |
| { |
| MamanBaz *self = MAMAN_BAZ (instance); |
| self->instance_member = 0xdeadbeaf; |
| } |
| </pre> |
| <p> |
| </p> |
| </div> |
| <div class="footer"> |
| <hr> |
| Generated by GTK-Doc V1.14</div> |
| </body> |
| </html> |