Blame docs/reference/gobject/html/howto-interface-prerequisite.html

Packit ae235b
Packit ae235b
<html>
Packit ae235b
<head>
Packit ae235b
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Packit ae235b
<title>Interface definition prerequisites: GObject Reference Manual</title>
Packit ae235b
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
Packit ae235b
<link rel="home" href="index.html" title="GObject Reference Manual">
Packit ae235b
<link rel="up" href="howto-interface.html" title="How to define and implement interfaces">
Packit ae235b
<link rel="prev" href="howto-interface-implement.html" title="Implementing interfaces">
Packit ae235b
<link rel="next" href="howto-interface-properties.html" title="Interface properties">
Packit ae235b
<meta name="generator" content="GTK-Doc V1.27 (XML mode)">
Packit ae235b
<link rel="stylesheet" href="style.css" type="text/css">
Packit ae235b
</head>
Packit ae235b
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
Packit ae235b
Packit ae235b
Packit ae235b
Home
Packit ae235b
Up
Packit ae235b
Prev
Packit ae235b
Next
Packit ae235b
Packit ae235b
Packit ae235b

Packit ae235b
Interface definition prerequisites
Packit ae235b

Packit ae235b
      To specify that an interface requires the presence of other interfaces
Packit ae235b
      when implemented, GObject introduces the concept of
Packit ae235b
      prerequisites: it is possible to associate
Packit ae235b
      a list of prerequisite types to an interface. For example, if
Packit ae235b
      object A wishes to implement interface I1, and if interface I1 has a
Packit ae235b
      prerequisite on interface I2, A has to implement both I1 and I2.
Packit ae235b
    

Packit ae235b

Packit ae235b
      The mechanism described above is, in practice, very similar to
Packit ae235b
      Java's interface I1 extends interface I2. The example below shows
Packit ae235b
      the GObject equivalent:
Packit ae235b

Packit ae235b
Packit ae235b
  
Packit ae235b
    
Packit ae235b
      
Packit ae235b
        
1
Packit ae235b
2
Packit ae235b
        
/* Make the ViewerEditableLossy interface require ViewerEditable interface. */
Packit ae235b
G_DEFINE_INTERFACE (ViewerEditableLossy, viewer_editable_lossy, VIEWER_TYPE_EDITABLE)
Packit ae235b
      
Packit ae235b
    
Packit ae235b
  
Packit ae235b
Packit ae235b
Packit ae235b

Packit ae235b
      In the G_DEFINE_INTERFACE
Packit ae235b
      call above, the third parameter defines the prerequisite type. This
Packit ae235b
      is the GType of either an interface or a class. In this case
Packit ae235b
      the ViewerEditable interface is a prerequisite of
Packit ae235b
      ViewerEditableLossy. The code
Packit ae235b
      below shows how an implementation can implement both interfaces and
Packit ae235b
      register their implementations:
Packit ae235b

Packit ae235b
Packit ae235b
  
Packit ae235b
    
Packit ae235b
      
Packit ae235b
        
1
Packit ae235b
2
Packit ae235b
3
Packit ae235b
4
Packit ae235b
5
Packit ae235b
6
Packit ae235b
7
Packit ae235b
8
Packit ae235b
9
Packit ae235b
10
Packit ae235b
11
Packit ae235b
12
Packit ae235b
13
Packit ae235b
14
Packit ae235b
15
Packit ae235b
16
Packit ae235b
17
Packit ae235b
18
Packit ae235b
19
Packit ae235b
20
Packit ae235b
21
Packit ae235b
22
Packit ae235b
23
Packit ae235b
24
Packit ae235b
25
Packit ae235b
26
Packit ae235b
27
Packit ae235b
28
Packit ae235b
29
Packit ae235b
30
Packit ae235b
31
Packit ae235b
32
Packit ae235b
33
Packit ae235b
34
Packit ae235b
35
Packit ae235b
36
Packit ae235b
37
Packit ae235b
38
Packit ae235b
39
Packit ae235b
40
Packit ae235b
41
Packit ae235b
42
Packit ae235b
43
Packit ae235b
44
Packit ae235b
45
Packit ae235b
46
Packit ae235b
47
Packit ae235b
48
Packit ae235b
49
Packit ae235b
50
Packit ae235b
51
Packit ae235b
52
Packit ae235b
53
Packit ae235b
54
Packit ae235b
55
Packit ae235b
56
Packit ae235b
57
Packit ae235b
58
Packit ae235b
59
Packit ae235b
60
Packit ae235b
61
Packit ae235b
62
Packit ae235b
63
Packit ae235b
64
Packit ae235b
65
Packit ae235b
66
Packit ae235b
67
Packit ae235b
68
Packit ae235b
69
Packit ae235b
70
Packit ae235b
        
static void
Packit ae235b
viewer_file_editable_lossy_compress (ViewerEditableLossy *editable)
Packit ae235b
{
Packit ae235b
  ViewerFile *self = VIEWER_FILE (editable);
Packit ae235b
Packit ae235b
  g_print ("File implementation of lossy editable interface compress method: %s.\n",
Packit ae235b
           self->filename);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_editable_lossy_interface_init (ViewerEditableLossyInterface *iface)
Packit ae235b
{
Packit ae235b
  iface->compress = viewer_file_editable_lossy_compress;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_editable_save (ViewerEditable  *editable,
Packit ae235b
                           GError         **error)
Packit ae235b
{
Packit ae235b
  ViewerFile *self = VIEWER_FILE (editable);
Packit ae235b
Packit ae235b
  g_print ("File implementation of editable interface save method: %s.\n",
Packit ae235b
           self->filename);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_editable_undo (ViewerEditable *editable,
Packit ae235b
                           guint           n_steps)
Packit ae235b
{
Packit ae235b
  ViewerFile *self = VIEWER_FILE (editable);
Packit ae235b
Packit ae235b
  g_print ("File implementation of editable interface undo method: %s.\n",
Packit ae235b
           self->filename);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_editable_redo (ViewerEditable *editable,
Packit ae235b
                           guint           n_steps)
Packit ae235b
{
Packit ae235b
  ViewerFile *self = VIEWER_FILE (editable);
Packit ae235b
Packit ae235b
  g_print ("File implementation of editable interface redo method: %s.\n",
Packit ae235b
           self->filename);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_editable_interface_init (ViewerEditableInterface *iface)
Packit ae235b
{
Packit ae235b
  iface->save = viewer_file_editable_save;
Packit ae235b
  iface->undo = viewer_file_editable_undo;
Packit ae235b
  iface->redo = viewer_file_editable_redo;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_class_init (ViewerFileClass *klass)
Packit ae235b
{
Packit ae235b
  /* Nothing here. */
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
viewer_file_init (ViewerFile *self)
Packit ae235b
{
Packit ae235b
  /* Instance variable initialisation code. */
Packit ae235b
}
Packit ae235b
Packit ae235b
G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT,
Packit ae235b
                         G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE,
Packit ae235b
                                                viewer_file_editable_interface_init)
Packit ae235b
                         G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE_LOSSY,
Packit ae235b
                                                viewer_file_editable_lossy_interface_init))
Packit ae235b
      
Packit ae235b
    
Packit ae235b
  
Packit ae235b
Packit ae235b
Packit ae235b

Packit ae235b
      It is very important to notice that the order in which interface
Packit ae235b
      implementations are added to the main object is not random:
Packit ae235b
      g_type_add_interface_static,
Packit ae235b
      which is called by
Packit ae235b
      G_IMPLEMENT_INTERFACE,
Packit ae235b
      must be invoked first on the interfaces which have no prerequisites and then on
Packit ae235b
      the others.
Packit ae235b
    

Packit ae235b
Packit ae235b
Packit ae235b

Generated by GTK-Doc V1.27
Packit ae235b
</body>
Packit ae235b
</html>