from https://developer.gnome.org

가장 먼저 필요한 헤더들을 #include 합니다:

/*
 * Copyright information
 */

#include "viewer-file.h"

/* Private structure definition. */
typedef struct {
  gchar *filename;
  /* stuff */
} ViewerFilePrivate;

/*
 * forward definitions
 */

[COMMENT] 위의 ViewerFilePrivate 이름의 private structure는 derivable type 선언 시에 필요한 private instance data의 예제인 듯 합니다. Final type의 경우 instance data structure가 c code에 생성되므로 전체가 private합니다. 그러므로 별도로 private structure를 작성할 필요가 없습니다.

만일 G_DECLARE_FINAL_TYPE를 사용하여 class를 final로 선언하려는 경우, 이의 instance structure가 c file에 정의(define)되어야 합니다:

struct _ViewerFile
{
  GObject parent_instance;

  /* Other members, including private data. */
};

G_DEFINE_TYPE 매크로를 type의 이름, 함수의 prefix, 그리고 parent의 Gtype을 인수로 전달하여 호출함으로써 필요한 bolierplate code를 짧게 만듭니다 (생성하려는 클래스가 “private data를 필요로 하는 derivable type인 경우” G_DEFINE_TYPE_WITH_PRIVATE을 사용).

G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT)

or

G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT)

이 매크로는:

  1. viewer_file_get_type 함수를 구현합니다.
  2. parent class pointer를 선언해서 c file 어디에서나 접근할 수 있도록 합니다.
  3. private instance data를 type에 추가합니다 (G_DEFINE_TYPE_WITH_PRIVATE를 사용하는 경우).

G_DECLARE_FINAL_TYPE을 이용하여 클래스를 final로 선언한 경우, private data는 instance structure인 ViewerFile에 위치해야 하고, G_DEFINE_TYPE_WITH_PRIVATE 대신 G_DEFINE_TYPE를 사용해야 합니다.

Final 클래스의 instance structure는 외부로 노출되지 않고, 다른 파행 클래스의 instance structure에 포함되지도 않습니다 (final이니까 당연히…). 그러므로 final 클래스의 instance structure 크기의 변화는 해당 class를 사용하는 코드들과의 비호환성을 유발하지 않습니다.

이와는 반대로, derivable 클래스의 private data는 반드시 private structure에 포함되어야 하며,G_DEFINE_TYPE_WITH_PRIVATE 를 사용해야 합니다.

get_type 함수의 정의를 수정하려는 목적으로 G_DEFINE_TYPE_WITH_CODE를 사용할 수 있습니다. 예를 들어 interface를 구현하려면 get type 함수의 구현에 G_IMPLEMENT_INTERFACE 매크로의 호출을 추가해야 합니다.