You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2019/03/18 00:03:48 UTC

[arrow] branch master updated: ARROW-4932: [GLib] Use G_DECLARE_DERIVABLE_TYPE macro

This is an automated email from the ASF dual-hosted git repository.

kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f740ac  ARROW-4932: [GLib] Use G_DECLARE_DERIVABLE_TYPE macro
2f740ac is described below

commit 2f740ac8840cd527caeca83ed19953decfc32e12
Author: Kenta Murata <mr...@mrkn.jp>
AuthorDate: Mon Mar 18 09:03:37 2019 +0900

    ARROW-4932: [GLib] Use G_DECLARE_DERIVABLE_TYPE macro
    
    Author: Kenta Murata <mr...@mrkn.jp>
    
    Closes #3945 from mrkn/glib_use_g_declare_derivable_type and squashes the following commits:
    
    4067d10a <Kenta Murata> Fix the parent class of GArrowStringArrayBuilder
    eb122593 <Kenta Murata> Use G_DECLARE_DERIVABLE_TYPE
---
 c_glib/arrow-glib/array-builder.h       | 864 +++++---------------------------
 c_glib/arrow-glib/basic-array.h         | 172 +------
 c_glib/arrow-glib/basic-data-type.h     | 375 ++------------
 c_glib/arrow-glib/chunked-array.h       |  43 +-
 c_glib/arrow-glib/composite-array.h     |  43 +-
 c_glib/arrow-glib/composite-data-type.h |  42 +-
 c_glib/arrow-glib/field.h               |  43 +-
 c_glib/arrow-glib/record-batch.h        |  43 +-
 c_glib/arrow-glib/tensor.h              |  35 +-
 9 files changed, 226 insertions(+), 1434 deletions(-)

diff --git a/c_glib/arrow-glib/array-builder.h b/c_glib/arrow-glib/array-builder.h
index 9fcadbd..075f080 100644
--- a/c_glib/arrow-glib/array-builder.h
+++ b/c_glib/arrow-glib/array-builder.h
@@ -70,46 +70,16 @@ gboolean garrow_null_array_builder_append_nulls(GArrowNullArrayBuilder *builder,
 
 #define GARROW_TYPE_BOOLEAN_ARRAY_BUILDER       \
   (garrow_boolean_array_builder_get_type())
-#define GARROW_BOOLEAN_ARRAY_BUILDER(obj)                               \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                                    \
-                              GARROW_TYPE_BOOLEAN_ARRAY_BUILDER,        \
-                              GArrowBooleanArrayBuilder))
-#define GARROW_BOOLEAN_ARRAY_BUILDER_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_BOOLEAN_ARRAY_BUILDER,   \
-                           GArrowBooleanArrayBuilderClass))
-#define GARROW_IS_BOOLEAN_ARRAY_BUILDER(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_BOOLEAN_ARRAY_BUILDER))
-#define GARROW_IS_BOOLEAN_ARRAY_BUILDER_CLASS(klass)            \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_BOOLEAN_ARRAY_BUILDER))
-#define GARROW_BOOLEAN_ARRAY_BUILDER_GET_CLASS(obj)             \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_BOOLEAN_ARRAY_BUILDER, \
-                             GArrowBooleanArrayBuilderClass))
-
-typedef struct _GArrowBooleanArrayBuilder         GArrowBooleanArrayBuilder;
-typedef struct _GArrowBooleanArrayBuilderClass    GArrowBooleanArrayBuilderClass;
-
-/**
- * GArrowBooleanArrayBuilder:
- *
- * It wraps `arrow::BooleanBuilder`.
- */
-struct _GArrowBooleanArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowBooleanArrayBuilder,
+                         garrow_boolean_array_builder,
+                         GARROW,
+                         BOOLEAN_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowBooleanArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_boolean_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowBooleanArrayBuilder *garrow_boolean_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -135,48 +105,17 @@ gboolean garrow_boolean_array_builder_append_nulls(GArrowBooleanArrayBuilder *bu
                                                    GError **error);
 
 
-#define GARROW_TYPE_INT_ARRAY_BUILDER           \
-  (garrow_int_array_builder_get_type())
-#define GARROW_INT_ARRAY_BUILDER(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_INT_ARRAY_BUILDER,    \
-                              GArrowIntArrayBuilder))
-#define GARROW_INT_ARRAY_BUILDER_CLASS(klass)                   \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_INT_ARRAY_BUILDER,       \
-                           GArrowIntArrayBuilderClass))
-#define GARROW_IS_INT_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_INT_ARRAY_BUILDER))
-#define GARROW_IS_INT_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_INT_ARRAY_BUILDER))
-#define GARROW_INT_ARRAY_BUILDER_GET_CLASS(obj)                 \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_INT_ARRAY_BUILDER,     \
-                             GArrowIntArrayBuilderClass))
-
-typedef struct _GArrowIntArrayBuilder         GArrowIntArrayBuilder;
-typedef struct _GArrowIntArrayBuilderClass    GArrowIntArrayBuilderClass;
-
-/**
- * GArrowIntArrayBuilder:
- *
- * It wraps `arrow::AdaptiveIntBuilder`.
- */
-struct _GArrowIntArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_INT_ARRAY_BUILDER (garrow_int_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowIntArrayBuilder,
+                         garrow_int_array_builder,
+                         GARROW,
+                         INT_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowIntArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_int_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowIntArrayBuilder *garrow_int_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -238,48 +177,17 @@ gboolean garrow_uint_array_builder_append_nulls(GArrowUIntArrayBuilder *builder,
                                                 GError **error);
 
 
-#define GARROW_TYPE_INT8_ARRAY_BUILDER          \
-  (garrow_int8_array_builder_get_type())
-#define GARROW_INT8_ARRAY_BUILDER(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_INT8_ARRAY_BUILDER,   \
-                              GArrowInt8ArrayBuilder))
-#define GARROW_INT8_ARRAY_BUILDER_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_INT8_ARRAY_BUILDER,      \
-                           GArrowInt8ArrayBuilderClass))
-#define GARROW_IS_INT8_ARRAY_BUILDER(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_INT8_ARRAY_BUILDER))
-#define GARROW_IS_INT8_ARRAY_BUILDER_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_INT8_ARRAY_BUILDER))
-#define GARROW_INT8_ARRAY_BUILDER_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_INT8_ARRAY_BUILDER,    \
-                             GArrowInt8ArrayBuilderClass))
-
-typedef struct _GArrowInt8ArrayBuilder         GArrowInt8ArrayBuilder;
-typedef struct _GArrowInt8ArrayBuilderClass    GArrowInt8ArrayBuilderClass;
-
-/**
- * GArrowInt8ArrayBuilder:
- *
- * It wraps `arrow::Int8Builder`.
- */
-struct _GArrowInt8ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_INT8_ARRAY_BUILDER (garrow_int8_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowInt8ArrayBuilder,
+                         garrow_int8_array_builder,
+                         GARROW,
+                         INT8_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowInt8ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_int8_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowInt8ArrayBuilder *garrow_int8_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -305,48 +213,17 @@ gboolean garrow_int8_array_builder_append_nulls(GArrowInt8ArrayBuilder *builder,
                                                 GError **error);
 
 
-#define GARROW_TYPE_UINT8_ARRAY_BUILDER         \
-  (garrow_uint8_array_builder_get_type())
-#define GARROW_UINT8_ARRAY_BUILDER(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_UINT8_ARRAY_BUILDER,  \
-                              GArrowUInt8ArrayBuilder))
-#define GARROW_UINT8_ARRAY_BUILDER_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_UINT8_ARRAY_BUILDER,     \
-                           GArrowUInt8ArrayBuilderClass))
-#define GARROW_IS_UINT8_ARRAY_BUILDER(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_UINT8_ARRAY_BUILDER))
-#define GARROW_IS_UINT8_ARRAY_BUILDER_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_UINT8_ARRAY_BUILDER))
-#define GARROW_UINT8_ARRAY_BUILDER_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_UINT8_ARRAY_BUILDER,   \
-                             GArrowUInt8ArrayBuilderClass))
-
-typedef struct _GArrowUInt8ArrayBuilder         GArrowUInt8ArrayBuilder;
-typedef struct _GArrowUInt8ArrayBuilderClass    GArrowUInt8ArrayBuilderClass;
-
-/**
- * GArrowUInt8ArrayBuilder:
- *
- * It wraps `arrow::UInt8Builder`.
- */
-struct _GArrowUInt8ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_UINT8_ARRAY_BUILDER (garrow_uint8_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowUInt8ArrayBuilder,
+                         garrow_uint8_array_builder,
+                         GARROW,
+                         UINT8_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowUInt8ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_uint8_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowUInt8ArrayBuilder *garrow_uint8_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -372,48 +249,17 @@ gboolean garrow_uint8_array_builder_append_nulls(GArrowUInt8ArrayBuilder *builde
                                                  GError **error);
 
 
-#define GARROW_TYPE_INT16_ARRAY_BUILDER         \
-  (garrow_int16_array_builder_get_type())
-#define GARROW_INT16_ARRAY_BUILDER(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_INT16_ARRAY_BUILDER,  \
-                              GArrowInt16ArrayBuilder))
-#define GARROW_INT16_ARRAY_BUILDER_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_INT16_ARRAY_BUILDER,     \
-                           GArrowInt16ArrayBuilderClass))
-#define GARROW_IS_INT16_ARRAY_BUILDER(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_INT16_ARRAY_BUILDER))
-#define GARROW_IS_INT16_ARRAY_BUILDER_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_INT16_ARRAY_BUILDER))
-#define GARROW_INT16_ARRAY_BUILDER_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_INT16_ARRAY_BUILDER,   \
-                             GArrowInt16ArrayBuilderClass))
-
-typedef struct _GArrowInt16ArrayBuilder         GArrowInt16ArrayBuilder;
-typedef struct _GArrowInt16ArrayBuilderClass    GArrowInt16ArrayBuilderClass;
-
-/**
- * GArrowInt16ArrayBuilder:
- *
- * It wraps `arrow::Int16Builder`.
- */
-struct _GArrowInt16ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_INT16_ARRAY_BUILDER (garrow_int16_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowInt16ArrayBuilder,
+                         garrow_int16_array_builder,
+                         GARROW,
+                         INT16_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowInt16ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_int16_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowInt16ArrayBuilder *garrow_int16_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -441,46 +287,16 @@ gboolean garrow_int16_array_builder_append_nulls(GArrowInt16ArrayBuilder *builde
 
 #define GARROW_TYPE_UINT16_ARRAY_BUILDER        \
   (garrow_uint16_array_builder_get_type())
-#define GARROW_UINT16_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_UINT16_ARRAY_BUILDER, \
-                              GArrowUInt16ArrayBuilder))
-#define GARROW_UINT16_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_UINT16_ARRAY_BUILDER,    \
-                           GArrowUInt16ArrayBuilderClass))
-#define GARROW_IS_UINT16_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_UINT16_ARRAY_BUILDER))
-#define GARROW_IS_UINT16_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_UINT16_ARRAY_BUILDER))
-#define GARROW_UINT16_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_UINT16_ARRAY_BUILDER,  \
-                             GArrowUInt16ArrayBuilderClass))
-
-typedef struct _GArrowUInt16ArrayBuilder         GArrowUInt16ArrayBuilder;
-typedef struct _GArrowUInt16ArrayBuilderClass    GArrowUInt16ArrayBuilderClass;
-
-/**
- * GArrowUInt16ArrayBuilder:
- *
- * It wraps `arrow::UInt16Builder`.
- */
-struct _GArrowUInt16ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowUInt16ArrayBuilder,
+                         garrow_uint16_array_builder,
+                         GARROW,
+                         UINT16_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowUInt16ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_uint16_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowUInt16ArrayBuilder *garrow_uint16_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -506,48 +322,17 @@ gboolean garrow_uint16_array_builder_append_nulls(GArrowUInt16ArrayBuilder *buil
                                                   GError **error);
 
 
-#define GARROW_TYPE_INT32_ARRAY_BUILDER         \
-  (garrow_int32_array_builder_get_type())
-#define GARROW_INT32_ARRAY_BUILDER(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_INT32_ARRAY_BUILDER,  \
-                              GArrowInt32ArrayBuilder))
-#define GARROW_INT32_ARRAY_BUILDER_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_INT32_ARRAY_BUILDER,     \
-                           GArrowInt32ArrayBuilderClass))
-#define GARROW_IS_INT32_ARRAY_BUILDER(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_INT32_ARRAY_BUILDER))
-#define GARROW_IS_INT32_ARRAY_BUILDER_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_INT32_ARRAY_BUILDER))
-#define GARROW_INT32_ARRAY_BUILDER_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_INT32_ARRAY_BUILDER,   \
-                             GArrowInt32ArrayBuilderClass))
-
-typedef struct _GArrowInt32ArrayBuilder         GArrowInt32ArrayBuilder;
-typedef struct _GArrowInt32ArrayBuilderClass    GArrowInt32ArrayBuilderClass;
-
-/**
- * GArrowInt32ArrayBuilder:
- *
- * It wraps `arrow::Int32Builder`.
- */
-struct _GArrowInt32ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_INT32_ARRAY_BUILDER (garrow_int32_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowInt32ArrayBuilder,
+                         garrow_int32_array_builder,
+                         GARROW,
+                         INT32_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowInt32ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_int32_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowInt32ArrayBuilder *garrow_int32_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -575,46 +360,16 @@ gboolean garrow_int32_array_builder_append_nulls(GArrowInt32ArrayBuilder *builde
 
 #define GARROW_TYPE_UINT32_ARRAY_BUILDER        \
   (garrow_uint32_array_builder_get_type())
-#define GARROW_UINT32_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_UINT32_ARRAY_BUILDER, \
-                              GArrowUInt32ArrayBuilder))
-#define GARROW_UINT32_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_UINT32_ARRAY_BUILDER,    \
-                           GArrowUInt32ArrayBuilderClass))
-#define GARROW_IS_UINT32_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_UINT32_ARRAY_BUILDER))
-#define GARROW_IS_UINT32_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_UINT32_ARRAY_BUILDER))
-#define GARROW_UINT32_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_UINT32_ARRAY_BUILDER,  \
-                             GArrowUInt32ArrayBuilderClass))
-
-typedef struct _GArrowUInt32ArrayBuilder         GArrowUInt32ArrayBuilder;
-typedef struct _GArrowUInt32ArrayBuilderClass    GArrowUInt32ArrayBuilderClass;
-
-/**
- * GArrowUInt32ArrayBuilder:
- *
- * It wraps `arrow::UInt32Builder`.
- */
-struct _GArrowUInt32ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowUInt32ArrayBuilder,
+                         garrow_uint32_array_builder,
+                         GARROW,
+                         UINT32_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowUInt32ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_uint32_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowUInt32ArrayBuilder *garrow_uint32_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -640,48 +395,17 @@ gboolean garrow_uint32_array_builder_append_nulls(GArrowUInt32ArrayBuilder *buil
                                                   GError **error);
 
 
-#define GARROW_TYPE_INT64_ARRAY_BUILDER         \
-  (garrow_int64_array_builder_get_type())
-#define GARROW_INT64_ARRAY_BUILDER(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_INT64_ARRAY_BUILDER,  \
-                              GArrowInt64ArrayBuilder))
-#define GARROW_INT64_ARRAY_BUILDER_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_INT64_ARRAY_BUILDER,     \
-                           GArrowInt64ArrayBuilderClass))
-#define GARROW_IS_INT64_ARRAY_BUILDER(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_INT64_ARRAY_BUILDER))
-#define GARROW_IS_INT64_ARRAY_BUILDER_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_INT64_ARRAY_BUILDER))
-#define GARROW_INT64_ARRAY_BUILDER_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_INT64_ARRAY_BUILDER,   \
-                             GArrowInt64ArrayBuilderClass))
-
-typedef struct _GArrowInt64ArrayBuilder         GArrowInt64ArrayBuilder;
-typedef struct _GArrowInt64ArrayBuilderClass    GArrowInt64ArrayBuilderClass;
-
-/**
- * GArrowInt64ArrayBuilder:
- *
- * It wraps `arrow::Int64Builder`.
- */
-struct _GArrowInt64ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_INT64_ARRAY_BUILDER (garrow_int64_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowInt64ArrayBuilder,
+                         garrow_int64_array_builder,
+                         GARROW,
+                         INT64_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowInt64ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_int64_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowInt64ArrayBuilder *garrow_int64_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -709,46 +433,16 @@ gboolean garrow_int64_array_builder_append_nulls(GArrowInt64ArrayBuilder *builde
 
 #define GARROW_TYPE_UINT64_ARRAY_BUILDER        \
   (garrow_uint64_array_builder_get_type())
-#define GARROW_UINT64_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_UINT64_ARRAY_BUILDER, \
-                              GArrowUInt64ArrayBuilder))
-#define GARROW_UINT64_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_UINT64_ARRAY_BUILDER,    \
-                           GArrowUInt64ArrayBuilderClass))
-#define GARROW_IS_UINT64_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_UINT64_ARRAY_BUILDER))
-#define GARROW_IS_UINT64_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_UINT64_ARRAY_BUILDER))
-#define GARROW_UINT64_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_UINT64_ARRAY_BUILDER,  \
-                             GArrowUInt64ArrayBuilderClass))
-
-typedef struct _GArrowUInt64ArrayBuilder         GArrowUInt64ArrayBuilder;
-typedef struct _GArrowUInt64ArrayBuilderClass    GArrowUInt64ArrayBuilderClass;
-
-/**
- * GArrowUInt64ArrayBuilder:
- *
- * It wraps `arrow::UInt64Builder`.
- */
-struct _GArrowUInt64ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowUInt64ArrayBuilder,
+                         garrow_uint64_array_builder,
+                         GARROW,
+                         UINT64_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowUInt64ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_uint64_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowUInt64ArrayBuilder *garrow_uint64_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -774,48 +468,17 @@ gboolean garrow_uint64_array_builder_append_nulls(GArrowUInt64ArrayBuilder *buil
                                                   GError **error);
 
 
-#define GARROW_TYPE_FLOAT_ARRAY_BUILDER         \
-  (garrow_float_array_builder_get_type())
-#define GARROW_FLOAT_ARRAY_BUILDER(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_FLOAT_ARRAY_BUILDER,  \
-                              GArrowFloatArrayBuilder))
-#define GARROW_FLOAT_ARRAY_BUILDER_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_FLOAT_ARRAY_BUILDER,     \
-                           GArrowFloatArrayBuilderClass))
-#define GARROW_IS_FLOAT_ARRAY_BUILDER(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_FLOAT_ARRAY_BUILDER))
-#define GARROW_IS_FLOAT_ARRAY_BUILDER_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_FLOAT_ARRAY_BUILDER))
-#define GARROW_FLOAT_ARRAY_BUILDER_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_FLOAT_ARRAY_BUILDER,   \
-                             GArrowFloatArrayBuilderClass))
-
-typedef struct _GArrowFloatArrayBuilder         GArrowFloatArrayBuilder;
-typedef struct _GArrowFloatArrayBuilderClass    GArrowFloatArrayBuilderClass;
-
-/**
- * GArrowFloatArrayBuilder:
- *
- * It wraps `arrow::FloatBuilder`.
- */
-struct _GArrowFloatArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_FLOAT_ARRAY_BUILDER (garrow_float_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowFloatArrayBuilder,
+                         garrow_float_array_builder,
+                         GARROW,
+                         FLOAT_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowFloatArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_float_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowFloatArrayBuilder *garrow_float_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -843,46 +506,16 @@ gboolean garrow_float_array_builder_append_nulls(GArrowFloatArrayBuilder *builde
 
 #define GARROW_TYPE_DOUBLE_ARRAY_BUILDER        \
   (garrow_double_array_builder_get_type())
-#define GARROW_DOUBLE_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_DOUBLE_ARRAY_BUILDER, \
-                              GArrowDoubleArrayBuilder))
-#define GARROW_DOUBLE_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_DOUBLE_ARRAY_BUILDER,    \
-                           GArrowDoubleArrayBuilderClass))
-#define GARROW_IS_DOUBLE_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_DOUBLE_ARRAY_BUILDER))
-#define GARROW_IS_DOUBLE_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_DOUBLE_ARRAY_BUILDER))
-#define GARROW_DOUBLE_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_DOUBLE_ARRAY_BUILDER,  \
-                             GArrowDoubleArrayBuilderClass))
-
-typedef struct _GArrowDoubleArrayBuilder         GArrowDoubleArrayBuilder;
-typedef struct _GArrowDoubleArrayBuilderClass    GArrowDoubleArrayBuilderClass;
-
-/**
- * GArrowDoubleArrayBuilder:
- *
- * It wraps `arrow::DoubleBuilder`.
- */
-struct _GArrowDoubleArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowDoubleArrayBuilder,
+                         garrow_double_array_builder,
+                         GARROW,
+                         DOUBLE_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowDoubleArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_double_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowDoubleArrayBuilder *garrow_double_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -910,46 +543,16 @@ gboolean garrow_double_array_builder_append_nulls(GArrowDoubleArrayBuilder *buil
 
 #define GARROW_TYPE_BINARY_ARRAY_BUILDER        \
   (garrow_binary_array_builder_get_type())
-#define GARROW_BINARY_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_BINARY_ARRAY_BUILDER, \
-                              GArrowBinaryArrayBuilder))
-#define GARROW_BINARY_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_BINARY_ARRAY_BUILDER,    \
-                           GArrowBinaryArrayBuilderClass))
-#define GARROW_IS_BINARY_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_BINARY_ARRAY_BUILDER))
-#define GARROW_IS_BINARY_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_BINARY_ARRAY_BUILDER))
-#define GARROW_BINARY_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_BINARY_ARRAY_BUILDER,  \
-                             GArrowBinaryArrayBuilderClass))
-
-typedef struct _GArrowBinaryArrayBuilder         GArrowBinaryArrayBuilder;
-typedef struct _GArrowBinaryArrayBuilderClass    GArrowBinaryArrayBuilderClass;
-
-/**
- * GArrowBinaryArrayBuilder:
- *
- * It wraps `arrow::BinaryBuilder`.
- */
-struct _GArrowBinaryArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowBinaryArrayBuilder,
+                         garrow_binary_array_builder,
+                         GARROW,
+                         BINARY_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowBinaryArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_binary_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowBinaryArrayBuilder *garrow_binary_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -970,46 +573,16 @@ gboolean garrow_binary_array_builder_append_null(GArrowBinaryArrayBuilder *build
 
 #define GARROW_TYPE_STRING_ARRAY_BUILDER        \
   (garrow_string_array_builder_get_type())
-#define GARROW_STRING_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_STRING_ARRAY_BUILDER, \
-                              GArrowStringArrayBuilder))
-#define GARROW_STRING_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_STRING_ARRAY_BUILDER,    \
-                           GArrowStringArrayBuilderClass))
-#define GARROW_IS_STRING_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_STRING_ARRAY_BUILDER))
-#define GARROW_IS_STRING_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_STRING_ARRAY_BUILDER))
-#define GARROW_STRING_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_STRING_ARRAY_BUILDER,  \
-                             GArrowStringArrayBuilderClass))
-
-typedef struct _GArrowStringArrayBuilder         GArrowStringArrayBuilder;
-typedef struct _GArrowStringArrayBuilderClass    GArrowStringArrayBuilderClass;
-
-/**
- * GArrowStringArrayBuilder:
- *
- * It wraps `arrow::StringBuilder`.
- */
-struct _GArrowStringArrayBuilder
-{
-  /*< private >*/
-  GArrowBinaryArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowStringArrayBuilder,
+                         garrow_string_array_builder,
+                         GARROW,
+                         STRING_ARRAY_BUILDER,
+                         GArrowBinaryArrayBuilder)
 struct _GArrowStringArrayBuilderClass
 {
   GArrowBinaryArrayBuilderClass parent_class;
 };
 
-GType garrow_string_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowStringArrayBuilder *garrow_string_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -1032,46 +605,16 @@ gboolean garrow_string_array_builder_append_values(GArrowStringArrayBuilder *bui
 
 #define GARROW_TYPE_DATE32_ARRAY_BUILDER        \
   (garrow_date32_array_builder_get_type())
-#define GARROW_DATE32_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_DATE32_ARRAY_BUILDER, \
-                              GArrowDate32ArrayBuilder))
-#define GARROW_DATE32_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_DATE32_ARRAY_BUILDER,    \
-                           GArrowDate32ArrayBuilderClass))
-#define GARROW_IS_DATE32_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_DATE32_ARRAY_BUILDER))
-#define GARROW_IS_DATE32_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_DATE32_ARRAY_BUILDER))
-#define GARROW_DATE32_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_DATE32_ARRAY_BUILDER,  \
-                             GArrowDate32ArrayBuilderClass))
-
-typedef struct _GArrowDate32ArrayBuilder         GArrowDate32ArrayBuilder;
-typedef struct _GArrowDate32ArrayBuilderClass    GArrowDate32ArrayBuilderClass;
-
-/**
- * GArrowDate32ArrayBuilder:
- *
- * It wraps `arrow::Date32Builder`.
- */
-struct _GArrowDate32ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowDate32ArrayBuilder,
+                         garrow_date32_array_builder,
+                         GARROW,
+                         DATE32_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowDate32ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_date32_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowDate32ArrayBuilder *garrow_date32_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -1099,46 +642,16 @@ gboolean garrow_date32_array_builder_append_nulls(GArrowDate32ArrayBuilder *buil
 
 #define GARROW_TYPE_DATE64_ARRAY_BUILDER        \
   (garrow_date64_array_builder_get_type())
-#define GARROW_DATE64_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_DATE64_ARRAY_BUILDER, \
-                              GArrowDate64ArrayBuilder))
-#define GARROW_DATE64_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_DATE64_ARRAY_BUILDER,    \
-                           GArrowDate64ArrayBuilderClass))
-#define GARROW_IS_DATE64_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_DATE64_ARRAY_BUILDER))
-#define GARROW_IS_DATE64_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_DATE64_ARRAY_BUILDER))
-#define GARROW_DATE64_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_DATE64_ARRAY_BUILDER,  \
-                             GArrowDate64ArrayBuilderClass))
-
-typedef struct _GArrowDate64ArrayBuilder         GArrowDate64ArrayBuilder;
-typedef struct _GArrowDate64ArrayBuilderClass    GArrowDate64ArrayBuilderClass;
-
-/**
- * GArrowDate64ArrayBuilder:
- *
- * It wraps `arrow::Date64Builder`.
- */
-struct _GArrowDate64ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowDate64ArrayBuilder,
+                         garrow_date64_array_builder,
+                         GARROW,
+                         DATE64_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowDate64ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_date64_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowDate64ArrayBuilder *garrow_date64_array_builder_new(void);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -1166,46 +679,16 @@ gboolean garrow_date64_array_builder_append_nulls(GArrowDate64ArrayBuilder *buil
 
 #define GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER     \
   (garrow_timestamp_array_builder_get_type())
-#define GARROW_TIMESTAMP_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                                    \
-                              GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER,      \
-                              GArrowTimestampArrayBuilder))
-#define GARROW_TIMESTAMP_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER, \
-                           GArrowTimestampArrayBuilderClass))
-#define GARROW_IS_TIMESTAMP_ARRAY_BUILDER(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER))
-#define GARROW_IS_TIMESTAMP_ARRAY_BUILDER_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                                     \
-                           GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER))
-#define GARROW_TIMESTAMP_ARRAY_BUILDER_GET_CLASS(obj)                   \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                                     \
-                             GARROW_TYPE_TIMESTAMP_ARRAY_BUILDER,       \
-                             GArrowTimestampArrayBuilderClass))
-
-typedef struct _GArrowTimestampArrayBuilder      GArrowTimestampArrayBuilder;
-typedef struct _GArrowTimestampArrayBuilderClass GArrowTimestampArrayBuilderClass;
-
-/**
- * GArrowTimestampArrayBuilder:
- *
- * It wraps `arrow::TimestampBuilder`.
- */
-struct _GArrowTimestampArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowTimestampArrayBuilder,
+                         garrow_timestamp_array_builder,
+                         GARROW,
+                         TIMESTAMP_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowTimestampArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_timestamp_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowTimestampArrayBuilder *
 garrow_timestamp_array_builder_new(GArrowTimestampDataType *data_type);
 
@@ -1234,46 +717,16 @@ gboolean garrow_timestamp_array_builder_append_nulls(GArrowTimestampArrayBuilder
 
 #define GARROW_TYPE_TIME32_ARRAY_BUILDER        \
   (garrow_time32_array_builder_get_type())
-#define GARROW_TIME32_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIME32_ARRAY_BUILDER, \
-                              GArrowTime32ArrayBuilder))
-#define GARROW_TIME32_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIME32_ARRAY_BUILDER,    \
-                           GArrowTime32ArrayBuilderClass))
-#define GARROW_IS_TIME32_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_TIME32_ARRAY_BUILDER))
-#define GARROW_IS_TIME32_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIME32_ARRAY_BUILDER))
-#define GARROW_TIME32_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIME32_ARRAY_BUILDER,  \
-                             GArrowTime32ArrayBuilderClass))
-
-typedef struct _GArrowTime32ArrayBuilder         GArrowTime32ArrayBuilder;
-typedef struct _GArrowTime32ArrayBuilderClass    GArrowTime32ArrayBuilderClass;
-
-/**
- * GArrowTime32ArrayBuilder:
- *
- * It wraps `arrow::Time32Builder`.
- */
-struct _GArrowTime32ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowTime32ArrayBuilder,
+                         garrow_time32_array_builder,
+                         GARROW,
+                         TIME32_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowTime32ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_time32_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowTime32ArrayBuilder *garrow_time32_array_builder_new(GArrowTime32DataType *data_type);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -1301,46 +754,16 @@ gboolean garrow_time32_array_builder_append_nulls(GArrowTime32ArrayBuilder *buil
 
 #define GARROW_TYPE_TIME64_ARRAY_BUILDER        \
   (garrow_time64_array_builder_get_type())
-#define GARROW_TIME64_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIME64_ARRAY_BUILDER, \
-                              GArrowTime64ArrayBuilder))
-#define GARROW_TIME64_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIME64_ARRAY_BUILDER,    \
-                           GArrowTime64ArrayBuilderClass))
-#define GARROW_IS_TIME64_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_TIME64_ARRAY_BUILDER))
-#define GARROW_IS_TIME64_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIME64_ARRAY_BUILDER))
-#define GARROW_TIME64_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIME64_ARRAY_BUILDER,  \
-                             GArrowTime64ArrayBuilderClass))
-
-typedef struct _GArrowTime64ArrayBuilder         GArrowTime64ArrayBuilder;
-typedef struct _GArrowTime64ArrayBuilderClass    GArrowTime64ArrayBuilderClass;
-
-/**
- * GArrowTime64ArrayBuilder:
- *
- * It wraps `arrow::Time64Builder`.
- */
-struct _GArrowTime64ArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowTime64ArrayBuilder,
+                         garrow_time64_array_builder,
+                         GARROW,
+                         TIME64_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowTime64ArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_time64_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowTime64ArrayBuilder *garrow_time64_array_builder_new(GArrowTime64DataType *data_type);
 
 #ifndef GARROW_DISABLE_DEPRECATED
@@ -1366,48 +789,17 @@ gboolean garrow_time64_array_builder_append_nulls(GArrowTime64ArrayBuilder *buil
                                                   GError **error);
 
 
-#define GARROW_TYPE_LIST_ARRAY_BUILDER          \
-  (garrow_list_array_builder_get_type())
-#define GARROW_LIST_ARRAY_BUILDER(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_LIST_ARRAY_BUILDER,   \
-                              GArrowListArrayBuilder))
-#define GARROW_LIST_ARRAY_BUILDER_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_LIST_ARRAY_BUILDER,      \
-                           GArrowListArrayBuilderClass))
-#define GARROW_IS_LIST_ARRAY_BUILDER(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_LIST_ARRAY_BUILDER))
-#define GARROW_IS_LIST_ARRAY_BUILDER_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_LIST_ARRAY_BUILDER))
-#define GARROW_LIST_ARRAY_BUILDER_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_LIST_ARRAY_BUILDER,    \
-                             GArrowListArrayBuilderClass))
-
-typedef struct _GArrowListArrayBuilder         GArrowListArrayBuilder;
-typedef struct _GArrowListArrayBuilderClass    GArrowListArrayBuilderClass;
-
-/**
- * GArrowListArrayBuilder:
- *
- * It wraps `arrow::ListBuilder`.
- */
-struct _GArrowListArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+#define GARROW_TYPE_LIST_ARRAY_BUILDER (garrow_list_array_builder_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowListArrayBuilder,
+                         garrow_list_array_builder,
+                         GARROW,
+                         LIST_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowListArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_list_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowListArrayBuilder *garrow_list_array_builder_new(GArrowListDataType *data_type,
                                                       GError **error);
 
@@ -1427,46 +819,16 @@ GArrowArrayBuilder *garrow_list_array_builder_get_value_builder(GArrowListArrayB
 
 #define GARROW_TYPE_STRUCT_ARRAY_BUILDER        \
   (garrow_struct_array_builder_get_type())
-#define GARROW_STRUCT_ARRAY_BUILDER(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_STRUCT_ARRAY_BUILDER, \
-                              GArrowStructArrayBuilder))
-#define GARROW_STRUCT_ARRAY_BUILDER_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_STRUCT_ARRAY_BUILDER,    \
-                           GArrowStructArrayBuilderClass))
-#define GARROW_IS_STRUCT_ARRAY_BUILDER(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                                    \
-                              GARROW_TYPE_STRUCT_ARRAY_BUILDER))
-#define GARROW_IS_STRUCT_ARRAY_BUILDER_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_STRUCT_ARRAY_BUILDER))
-#define GARROW_STRUCT_ARRAY_BUILDER_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_STRUCT_ARRAY_BUILDER,  \
-                             GArrowStructArrayBuilderClass))
-
-typedef struct _GArrowStructArrayBuilder         GArrowStructArrayBuilder;
-typedef struct _GArrowStructArrayBuilderClass    GArrowStructArrayBuilderClass;
-
-/**
- * GArrowStructArrayBuilder:
- *
- * It wraps `arrow::StructBuilder`.
- */
-struct _GArrowStructArrayBuilder
-{
-  /*< private >*/
-  GArrowArrayBuilder parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowStructArrayBuilder,
+                         garrow_struct_array_builder,
+                         GARROW,
+                         STRUCT_ARRAY_BUILDER,
+                         GArrowArrayBuilder)
 struct _GArrowStructArrayBuilderClass
 {
   GArrowArrayBuilderClass parent_class;
 };
 
-GType garrow_struct_array_builder_get_type(void) G_GNUC_CONST;
-
 GArrowStructArrayBuilder *garrow_struct_array_builder_new(GArrowStructDataType *data_type,
                                                           GError **error);
 
diff --git a/c_glib/arrow-glib/basic-array.h b/c_glib/arrow-glib/basic-array.h
index 33a1f1c..d10abea 100644
--- a/c_glib/arrow-glib/basic-array.h
+++ b/c_glib/arrow-glib/basic-array.h
@@ -62,48 +62,17 @@ gchar         *garrow_array_to_string   (GArrowArray *array,
                                          GError **error);
 
 
-#define GARROW_TYPE_NULL_ARRAY                  \
-  (garrow_null_array_get_type())
-#define GARROW_NULL_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_NULL_ARRAY,   \
-                              GArrowNullArray))
-#define GARROW_NULL_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_NULL_ARRAY,      \
-                           GArrowNullArrayClass))
-#define GARROW_IS_NULL_ARRAY(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_NULL_ARRAY))
-#define GARROW_IS_NULL_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_NULL_ARRAY))
-#define GARROW_NULL_ARRAY_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_NULL_ARRAY,    \
-                             GArrowNullArrayClass))
-
-typedef struct _GArrowNullArray         GArrowNullArray;
-typedef struct _GArrowNullArrayClass    GArrowNullArrayClass;
-
-/**
- * GArrowNullArray:
- *
- * It wraps `arrow::NullArray`.
- */
-struct _GArrowNullArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
+#define GARROW_TYPE_NULL_ARRAY (garrow_null_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowNullArray,
+                         garrow_null_array,
+                         GARROW,
+                         NULL_ARRAY,
+                         GArrowArray)
 struct _GArrowNullArrayClass
 {
   GArrowArrayClass parent_class;
 };
 
-GType garrow_null_array_get_type(void) G_GNUC_CONST;
-
 GArrowNullArray *garrow_null_array_new(gint64 length);
 
 
@@ -121,48 +90,17 @@ struct _GArrowPrimitiveArrayClass
 GArrowBuffer *garrow_primitive_array_get_buffer(GArrowPrimitiveArray *array);
 
 
-#define GARROW_TYPE_BOOLEAN_ARRAY               \
-  (garrow_boolean_array_get_type())
-#define GARROW_BOOLEAN_ARRAY(obj)                               \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_BOOLEAN_ARRAY,        \
-                              GArrowBooleanArray))
-#define GARROW_BOOLEAN_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_BOOLEAN_ARRAY,   \
-                           GArrowBooleanArrayClass))
-#define GARROW_IS_BOOLEAN_ARRAY(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BOOLEAN_ARRAY))
-#define GARROW_IS_BOOLEAN_ARRAY_CLASS(klass)            \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_BOOLEAN_ARRAY))
-#define GARROW_BOOLEAN_ARRAY_GET_CLASS(obj)             \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_BOOLEAN_ARRAY, \
-                             GArrowBooleanArrayClass))
-
-typedef struct _GArrowBooleanArray         GArrowBooleanArray;
-typedef struct _GArrowBooleanArrayClass    GArrowBooleanArrayClass;
-
-/**
- * GArrowBooleanArray:
- *
- * It wraps `arrow::BooleanArray`.
- */
-struct _GArrowBooleanArray
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
+#define GARROW_TYPE_BOOLEAN_ARRAY (garrow_boolean_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowBooleanArray,
+                         garrow_boolean_array,
+                         GARROW,
+                         BOOLEAN_ARRAY,
+                         GArrowPrimitiveArray)
 struct _GArrowBooleanArrayClass
 {
   GArrowPrimitiveArrayClass parent_class;
 };
 
-GType          garrow_boolean_array_get_type  (void) G_GNUC_CONST;
-
 GArrowBooleanArray *garrow_boolean_array_new(gint64 length,
                                              GArrowBuffer *data,
                                              GArrowBuffer *null_bitmap,
@@ -405,48 +343,17 @@ const gdouble *garrow_double_array_get_values(GArrowDoubleArray *array,
                                               gint64 *length);
 
 
-#define GARROW_TYPE_BINARY_ARRAY                \
-  (garrow_binary_array_get_type())
-#define GARROW_BINARY_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_BINARY_ARRAY, \
-                              GArrowBinaryArray))
-#define GARROW_BINARY_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_BINARY_ARRAY,    \
-                           GArrowBinaryArrayClass))
-#define GARROW_IS_BINARY_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BINARY_ARRAY))
-#define GARROW_IS_BINARY_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_BINARY_ARRAY))
-#define GARROW_BINARY_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_BINARY_ARRAY,  \
-                             GArrowBinaryArrayClass))
-
-typedef struct _GArrowBinaryArray         GArrowBinaryArray;
-typedef struct _GArrowBinaryArrayClass    GArrowBinaryArrayClass;
-
-/**
- * GArrowBinaryArray:
- *
- * It wraps `arrow::BinaryArray`.
- */
-struct _GArrowBinaryArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
+#define GARROW_TYPE_BINARY_ARRAY (garrow_binary_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowBinaryArray,
+                         garrow_binary_array,
+                         GARROW,
+                         BINARY_ARRAY,
+                         GArrowArray)
 struct _GArrowBinaryArrayClass
 {
   GArrowArrayClass parent_class;
 };
 
-GType garrow_binary_array_get_type(void) G_GNUC_CONST;
-
 GArrowBinaryArray *garrow_binary_array_new(gint64 length,
                                            GArrowBuffer *value_offsets,
                                            GArrowBuffer *data,
@@ -458,48 +365,17 @@ GBytes *garrow_binary_array_get_value(GArrowBinaryArray *array,
 GArrowBuffer *garrow_binary_array_get_buffer(GArrowBinaryArray *array);
 GArrowBuffer *garrow_binary_array_get_offsets_buffer(GArrowBinaryArray *array);
 
-#define GARROW_TYPE_STRING_ARRAY                \
-  (garrow_string_array_get_type())
-#define GARROW_STRING_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_STRING_ARRAY, \
-                              GArrowStringArray))
-#define GARROW_STRING_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_STRING_ARRAY,    \
-                           GArrowStringArrayClass))
-#define GARROW_IS_STRING_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_STRING_ARRAY))
-#define GARROW_IS_STRING_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_STRING_ARRAY))
-#define GARROW_STRING_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_STRING_ARRAY,  \
-                             GArrowStringArrayClass))
-
-typedef struct _GArrowStringArray         GArrowStringArray;
-typedef struct _GArrowStringArrayClass    GArrowStringArrayClass;
-
-/**
- * GArrowStringArray:
- *
- * It wraps `arrow::StringArray`.
- */
-struct _GArrowStringArray
-{
-  /*< private >*/
-  GArrowBinaryArray parent_instance;
-};
-
+#define GARROW_TYPE_STRING_ARRAY (garrow_string_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowStringArray,
+                         garrow_string_array,
+                         GARROW,
+                         STRING_ARRAY,
+                         GArrowBinaryArray)
 struct _GArrowStringArrayClass
 {
   GArrowBinaryArrayClass parent_class;
 };
 
-GType garrow_string_array_get_type(void) G_GNUC_CONST;
-
 GArrowStringArray *garrow_string_array_new(gint64 length,
                                            GArrowBuffer *value_offsets,
                                            GArrowBuffer *data,
diff --git a/c_glib/arrow-glib/basic-data-type.h b/c_glib/arrow-glib/basic-data-type.h
index d189582..ccbe0a5 100644
--- a/c_glib/arrow-glib/basic-data-type.h
+++ b/c_glib/arrow-glib/basic-data-type.h
@@ -61,45 +61,16 @@ GList *garrow_fixed_width_data_type_get_buffer_layout(GArrowFixedWidthDataType *
 
 #define GARROW_TYPE_NULL_DATA_TYPE              \
   (garrow_null_data_type_get_type())
-#define GARROW_NULL_DATA_TYPE(obj)                              \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_NULL_DATA_TYPE,       \
-                              GArrowNullDataType))
-#define GARROW_NULL_DATA_TYPE_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_NULL_DATA_TYPE,  \
-                           GArrowNullDataTypeClass))
-#define GARROW_IS_NULL_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_NULL_DATA_TYPE))
-#define GARROW_IS_NULL_DATA_TYPE_CLASS(klass)           \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_NULL_DATA_TYPE))
-#define GARROW_NULL_DATA_TYPE_GET_CLASS(obj)                    \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_NULL_DATA_TYPE,        \
-                             GArrowNullDataTypeClass))
-
-typedef struct _GArrowNullDataType         GArrowNullDataType;
-typedef struct _GArrowNullDataTypeClass    GArrowNullDataTypeClass;
-
-/**
- * GArrowNullDataType:
- *
- * It wraps `arrow::NullType`.
- */
-struct _GArrowNullDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+G_DECLARE_DERIVABLE_TYPE(GArrowNullDataType,
+                         garrow_null_data_type,
+                         GARROW,
+                         NULL_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowNullDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType               garrow_null_data_type_get_type (void) G_GNUC_CONST;
 GArrowNullDataType *garrow_null_data_type_new      (void);
 
 
@@ -294,47 +265,17 @@ struct _GArrowDoubleDataTypeClass
 GArrowDoubleDataType *garrow_double_data_type_new      (void);
 
 
-#define GARROW_TYPE_BINARY_DATA_TYPE            \
-  (garrow_binary_data_type_get_type())
-#define GARROW_BINARY_DATA_TYPE(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_BINARY_DATA_TYPE,     \
-                              GArrowBinaryDataType))
-#define GARROW_BINARY_DATA_TYPE_CLASS(klass)                    \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_BINARY_DATA_TYPE,        \
-                           GArrowBinaryDataTypeClass))
-#define GARROW_IS_BINARY_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BINARY_DATA_TYPE))
-#define GARROW_IS_BINARY_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_BINARY_DATA_TYPE))
-#define GARROW_BINARY_DATA_TYPE_GET_CLASS(obj)                  \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_BINARY_DATA_TYPE,      \
-                             GArrowBinaryDataTypeClass))
-
-typedef struct _GArrowBinaryDataType         GArrowBinaryDataType;
-typedef struct _GArrowBinaryDataTypeClass    GArrowBinaryDataTypeClass;
-
-/**
- * GArrowBinaryDataType:
- *
- * It wraps `arrow::BinaryType`.
- */
-struct _GArrowBinaryDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_BINARY_DATA_TYPE (garrow_binary_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowBinaryDataType,
+                         garrow_binary_data_type,
+                         GARROW,
+                         BINARY_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowBinaryDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType                 garrow_binary_data_type_get_type (void) G_GNUC_CONST;
 GArrowBinaryDataType *garrow_binary_data_type_new      (void);
 
 
@@ -357,314 +298,104 @@ gint32
 garrow_fixed_size_binary_data_type_get_byte_width(GArrowFixedSizeBinaryDataType *data_type);
 
 
-#define GARROW_TYPE_STRING_DATA_TYPE            \
-  (garrow_string_data_type_get_type())
-#define GARROW_STRING_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                           \
-                              GARROW_TYPE_STRING_DATA_TYPE,    \
-                              GArrowStringDataType))
-#define GARROW_STRING_DATA_TYPE_CLASS(klass)                   \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                            \
-                           GARROW_TYPE_STRING_DATA_TYPE,       \
-                           GArrowStringDataTypeClass))
-#define GARROW_IS_STRING_DATA_TYPE(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                           \
-                              GARROW_TYPE_STRING_DATA_TYPE))
-#define GARROW_IS_STRING_DATA_TYPE_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                            \
-                           GARROW_TYPE_STRING_DATA_TYPE))
-#define GARROW_STRING_DATA_TYPE_GET_CLASS(obj)                 \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                            \
-                             GARROW_TYPE_STRING_DATA_TYPE,     \
-                             GArrowStringDataTypeClass))
-
-typedef struct _GArrowStringDataType         GArrowStringDataType;
-typedef struct _GArrowStringDataTypeClass    GArrowStringDataTypeClass;
-
-/**
- * GArrowStringDataType:
- *
- * It wraps `arrow::StringType`.
- */
-struct _GArrowStringDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_STRING_DATA_TYPE (garrow_string_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowStringDataType,
+                         garrow_string_data_type,
+                         GARROW,
+                         STRING_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowStringDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType                 garrow_string_data_type_get_type (void) G_GNUC_CONST;
 GArrowStringDataType *garrow_string_data_type_new      (void);
 
 
-#define GARROW_TYPE_DATE32_DATA_TYPE           \
-  (garrow_date32_data_type_get_type())
-#define GARROW_DATE32_DATA_TYPE(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_DATE32_DATA_TYPE,     \
-                              GArrowDate32DataType))
-#define GARROW_DATE32_DATA_TYPE_CLASS(klass)                    \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_DATE32_DATA_TYPE,        \
-                           GArrowDate32DataTypeClass))
-#define GARROW_IS_DATE32_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_DATE32_DATA_TYPE))
-#define GARROW_IS_DATE32_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_DATE32_DATA_TYPE))
-#define GARROW_DATE32_DATA_TYPE_GET_CLASS(obj)                  \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_DATE32_DATA_TYPE,      \
-                             GArrowDate32DataTypeClass))
-
-typedef struct _GArrowDate32DataType         GArrowDate32DataType;
-typedef struct _GArrowDate32DataTypeClass    GArrowDate32DataTypeClass;
-
-/**
- * GArrowDate32DataType:
- *
- * It wraps `arrow::Date32Type`.
- */
-struct _GArrowDate32DataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_DATE32_DATA_TYPE (garrow_date32_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowDate32DataType,
+                         garrow_date32_data_type,
+                         GARROW,
+                         DATE32_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowDate32DataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType                 garrow_date32_data_type_get_type (void) G_GNUC_CONST;
 GArrowDate32DataType *garrow_date32_data_type_new      (void);
 
 
-#define GARROW_TYPE_DATE64_DATA_TYPE           \
-  (garrow_date64_data_type_get_type())
-#define GARROW_DATE64_DATA_TYPE(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_DATE64_DATA_TYPE,     \
-                              GArrowDate64DataType))
-#define GARROW_DATE64_DATA_TYPE_CLASS(klass)                    \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_DATE64_DATA_TYPE,        \
-                           GArrowDate64DataTypeClass))
-#define GARROW_IS_DATE64_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_DATE64_DATA_TYPE))
-#define GARROW_IS_DATE64_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_DATE64_DATA_TYPE))
-#define GARROW_DATE64_DATA_TYPE_GET_CLASS(obj)                  \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_DATE64_DATA_TYPE,      \
-                             GArrowDate64DataTypeClass))
-
-typedef struct _GArrowDate64DataType         GArrowDate64DataType;
-typedef struct _GArrowDate64DataTypeClass    GArrowDate64DataTypeClass;
-
-/**
- * GArrowDate64DataType:
- *
- * It wraps `arrow::Date64Type`.
- */
-struct _GArrowDate64DataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_DATE64_DATA_TYPE (garrow_date64_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowDate64DataType,
+                         garrow_date64_data_type,
+                         GARROW,
+                         DATE64_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowDate64DataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType                 garrow_date64_data_type_get_type (void) G_GNUC_CONST;
 GArrowDate64DataType *garrow_date64_data_type_new      (void);
 
 
-#define GARROW_TYPE_TIMESTAMP_DATA_TYPE         \
-  (garrow_timestamp_data_type_get_type())
-#define GARROW_TIMESTAMP_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIMESTAMP_DATA_TYPE,  \
-                              GArrowTimestampDataType))
-#define GARROW_TIMESTAMP_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIMESTAMP_DATA_TYPE,     \
-                           GArrowTimestampDataTypeClass))
-#define GARROW_IS_TIMESTAMP_DATA_TYPE(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIMESTAMP_DATA_TYPE))
-#define GARROW_IS_TIMESTAMP_DATA_TYPE_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIMESTAMP_DATA_TYPE))
-#define GARROW_TIMESTAMP_DATA_TYPE_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIMESTAMP_DATA_TYPE,   \
-                             GArrowTimestampDataTypeClass))
-
-typedef struct _GArrowTimestampDataType         GArrowTimestampDataType;
-typedef struct _GArrowTimestampDataTypeClass    GArrowTimestampDataTypeClass;
-
-/**
- * GArrowTimestampDataType:
- *
- * It wraps `arrow::TimestampType`.
- */
-struct _GArrowTimestampDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_TIMESTAMP_DATA_TYPE (garrow_timestamp_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowTimestampDataType,
+                         garrow_timestamp_data_type,
+                         GARROW,
+                         TIMESTAMP_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowTimestampDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType                 garrow_timestamp_data_type_get_type (void) G_GNUC_CONST;
 GArrowTimestampDataType *garrow_timestamp_data_type_new   (GArrowTimeUnit unit);
 GArrowTimeUnit
 garrow_timestamp_data_type_get_unit (GArrowTimestampDataType *timestamp_data_type);
 
 
-#define GARROW_TYPE_TIME_DATA_TYPE              \
-  (garrow_time_data_type_get_type())
-#define GARROW_TIME_DATA_TYPE(obj)                              \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIME_DATA_TYPE,       \
-                              GArrowTimeDataType))
-#define GARROW_TIME_DATA_TYPE_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_TIME_DATA_TYPE,  \
-                           GArrowTimeDataTypeClass))
-#define GARROW_IS_TIME_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIME_DATA_TYPE))
-#define GARROW_IS_TIME_DATA_TYPE_CLASS(klass)           \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_TIME_DATA_TYPE))
-#define GARROW_TIME_DATA_TYPE_GET_CLASS(obj)                    \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIME_DATA_TYPE,        \
-                             GArrowTimeDataTypeClass))
-
-typedef struct _GArrowTimeDataType         GArrowTimeDataType;
-typedef struct _GArrowTimeDataTypeClass    GArrowTimeDataTypeClass;
-
-/**
- * GArrowTimeDataType:
- *
- * It wraps `arrow::TimeType`.
- */
-struct _GArrowTimeDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_TIME_DATA_TYPE (garrow_time_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowTimeDataType,
+                         garrow_time_data_type,
+                         GARROW,
+                         TIME_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowTimeDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType          garrow_time_data_type_get_type (void) G_GNUC_CONST;
 GArrowTimeUnit garrow_time_data_type_get_unit (GArrowTimeDataType *time_data_type);
 
 
-#define GARROW_TYPE_TIME32_DATA_TYPE           \
-  (garrow_time32_data_type_get_type())
-#define GARROW_TIME32_DATA_TYPE(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIME32_DATA_TYPE,     \
-                              GArrowTime32DataType))
-#define GARROW_TIME32_DATA_TYPE_CLASS(klass)                    \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIME32_DATA_TYPE,        \
-                           GArrowTime32DataTypeClass))
-#define GARROW_IS_TIME32_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIME32_DATA_TYPE))
-#define GARROW_IS_TIME32_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIME32_DATA_TYPE))
-#define GARROW_TIME32_DATA_TYPE_GET_CLASS(obj)                  \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIME32_DATA_TYPE,      \
-                             GArrowTime32DataTypeClass))
-
-typedef struct _GArrowTime32DataType         GArrowTime32DataType;
-typedef struct _GArrowTime32DataTypeClass    GArrowTime32DataTypeClass;
-
-/**
- * GArrowTime32DataType:
- *
- * It wraps `arrow::Time32Type`.
- */
-struct _GArrowTime32DataType
-{
-  /*< private >*/
-  GArrowTimeDataType parent_instance;
-};
-
+#define GARROW_TYPE_TIME32_DATA_TYPE (garrow_time32_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowTime32DataType,
+                         garrow_time32_data_type,
+                         GARROW,
+                         TIME32_DATA_TYPE,
+                         GArrowTimeDataType)
 struct _GArrowTime32DataTypeClass
 {
   GArrowTimeDataTypeClass parent_class;
 };
 
-GType                 garrow_time32_data_type_get_type (void) G_GNUC_CONST;
 GArrowTime32DataType *garrow_time32_data_type_new      (GArrowTimeUnit unit,
                                                         GError **error);
 
 
-#define GARROW_TYPE_TIME64_DATA_TYPE           \
-  (garrow_time64_data_type_get_type())
-#define GARROW_TIME64_DATA_TYPE(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIME64_DATA_TYPE,     \
-                              GArrowTime64DataType))
-#define GARROW_TIME64_DATA_TYPE_CLASS(klass)                    \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_TIME64_DATA_TYPE,        \
-                           GArrowTime64DataTypeClass))
-#define GARROW_IS_TIME64_DATA_TYPE(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIME64_DATA_TYPE))
-#define GARROW_IS_TIME64_DATA_TYPE_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIME64_DATA_TYPE))
-#define GARROW_TIME64_DATA_TYPE_GET_CLASS(obj)                  \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIME64_DATA_TYPE,      \
-                             GArrowTime64DataTypeClass))
-
-typedef struct _GArrowTime64DataType         GArrowTime64DataType;
-typedef struct _GArrowTime64DataTypeClass    GArrowTime64DataTypeClass;
-
-/**
- * GArrowTime64DataType:
- *
- * It wraps `arrow::Time64Type`.
- */
-struct _GArrowTime64DataType
-{
-  /*< private >*/
-  GArrowTimeDataType parent_instance;
-};
-
+#define GARROW_TYPE_TIME64_DATA_TYPE (garrow_time64_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowTime64DataType,
+                         garrow_time64_data_type,
+                         GARROW,
+                         TIME64_DATA_TYPE,
+                         GArrowTimeDataType)
 struct _GArrowTime64DataTypeClass
 {
   GArrowTimeDataTypeClass parent_class;
 };
 
-GType                 garrow_time64_data_type_get_type (void) G_GNUC_CONST;
 GArrowTime64DataType *garrow_time64_data_type_new      (GArrowTimeUnit unit,
                                                         GError **error);
 
diff --git a/c_glib/arrow-glib/chunked-array.h b/c_glib/arrow-glib/chunked-array.h
index a1712a2..882f8f2 100644
--- a/c_glib/arrow-glib/chunked-array.h
+++ b/c_glib/arrow-glib/chunked-array.h
@@ -23,48 +23,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_CHUNKED_ARRAY               \
-  (garrow_chunked_array_get_type())
-#define GARROW_CHUNKED_ARRAY(obj)                               \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_CHUNKED_ARRAY,        \
-                              GArrowChunkedArray))
-#define GARROW_CHUNKED_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_CHUNKED_ARRAY,   \
-                           GArrowChunkedArrayClass))
-#define GARROW_IS_CHUNKED_ARRAY(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_CHUNKED_ARRAY))
-#define GARROW_IS_CHUNKED_ARRAY_CLASS(klass)            \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_CHUNKED_ARRAY))
-#define GARROW_CHUNKED_ARRAY_GET_CLASS(obj)             \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_CHUNKED_ARRAY, \
-                             GArrowChunkedArrayClass))
-
-typedef struct _GArrowChunkedArray         GArrowChunkedArray;
-typedef struct _GArrowChunkedArrayClass    GArrowChunkedArrayClass;
-
-/**
- * GArrowChunkedArray:
- *
- * It wraps `arrow::ChunkedArray`.
- */
-struct _GArrowChunkedArray
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
+#define GARROW_TYPE_CHUNKED_ARRAY (garrow_chunked_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowChunkedArray,
+                         garrow_chunked_array,
+                         GARROW,
+                         CHUNKED_ARRAY,
+                         GObject)
 struct _GArrowChunkedArrayClass
 {
   GObjectClass parent_class;
 };
 
-GType garrow_chunked_array_get_type(void) G_GNUC_CONST;
-
 GArrowChunkedArray *garrow_chunked_array_new(GList *chunks);
 
 gboolean garrow_chunked_array_equal(GArrowChunkedArray *chunked_array,
diff --git a/c_glib/arrow-glib/composite-array.h b/c_glib/arrow-glib/composite-array.h
index 47cd573..a181ffc 100644
--- a/c_glib/arrow-glib/composite-array.h
+++ b/c_glib/arrow-glib/composite-array.h
@@ -26,48 +26,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_LIST_ARRAY                  \
-  (garrow_list_array_get_type())
-#define GARROW_LIST_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_LIST_ARRAY,   \
-                              GArrowListArray))
-#define GARROW_LIST_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_LIST_ARRAY,      \
-                           GArrowListArrayClass))
-#define GARROW_IS_LIST_ARRAY(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_LIST_ARRAY))
-#define GARROW_IS_LIST_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_LIST_ARRAY))
-#define GARROW_LIST_ARRAY_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_LIST_ARRAY,    \
-                             GArrowListArrayClass))
-
-typedef struct _GArrowListArray         GArrowListArray;
-typedef struct _GArrowListArrayClass    GArrowListArrayClass;
-
-/**
- * GArrowListArray:
- *
- * It wraps `arrow::ListArray`.
- */
-struct _GArrowListArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
+#define GARROW_TYPE_LIST_ARRAY (garrow_list_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowListArray,
+                         garrow_list_array,
+                         GARROW,
+                         LIST_ARRAY,
+                         GArrowArray)
 struct _GArrowListArrayClass
 {
   GArrowArrayClass parent_class;
 };
 
-GType garrow_list_array_get_type(void) G_GNUC_CONST;
-
 GArrowListArray *garrow_list_array_new(GArrowDataType *data_type,
                                        gint64 length,
                                        GArrowBuffer *value_offsets,
diff --git a/c_glib/arrow-glib/composite-data-type.h b/c_glib/arrow-glib/composite-data-type.h
index beb3125..f0eed87 100644
--- a/c_glib/arrow-glib/composite-data-type.h
+++ b/c_glib/arrow-glib/composite-data-type.h
@@ -26,47 +26,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_LIST_DATA_TYPE              \
-  (garrow_list_data_type_get_type())
-#define GARROW_LIST_DATA_TYPE(obj)                              \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_LIST_DATA_TYPE,       \
-                              GArrowListDataType))
-#define GARROW_LIST_DATA_TYPE_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_LIST_DATA_TYPE,  \
-                           GArrowListDataTypeClass))
-#define GARROW_IS_LIST_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_LIST_DATA_TYPE))
-#define GARROW_IS_LIST_DATA_TYPE_CLASS(klass)           \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_LIST_DATA_TYPE))
-#define GARROW_LIST_DATA_TYPE_GET_CLASS(obj)                    \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_LIST_DATA_TYPE,        \
-                             GArrowListDataTypeClass))
-
-typedef struct _GArrowListDataType         GArrowListDataType;
-typedef struct _GArrowListDataTypeClass    GArrowListDataTypeClass;
-
-/**
- * GArrowListDataType:
- *
- * It wraps `arrow::ListType`.
- */
-struct _GArrowListDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_LIST_DATA_TYPE (garrow_list_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowListDataType,
+                         garrow_list_data_type,
+                         GARROW,
+                         LIST_DATA_TYPE,
+                         GArrowDataType)
 struct _GArrowListDataTypeClass
 {
   GArrowDataTypeClass parent_class;
 };
 
-GType               garrow_list_data_type_get_type (void) G_GNUC_CONST;
 GArrowListDataType *garrow_list_data_type_new      (GArrowField *field);
 #ifndef GARROW_DISABLE_DEPRECATED
 GARROW_DEPRECATED_IN_0_13_FOR(garrow_list_data_type_get_field)
diff --git a/c_glib/arrow-glib/field.h b/c_glib/arrow-glib/field.h
index b1844f4..d7b6840 100644
--- a/c_glib/arrow-glib/field.h
+++ b/c_glib/arrow-glib/field.h
@@ -23,48 +23,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_FIELD                       \
-  (garrow_field_get_type())
-#define GARROW_FIELD(obj)                               \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_FIELD,        \
-                              GArrowField))
-#define GARROW_FIELD_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_CAST((klass),             \
-                           GARROW_TYPE_FIELD,   \
-                           GArrowFieldClass))
-#define GARROW_IS_FIELD(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_FIELD))
-#define GARROW_IS_FIELD_CLASS(klass)            \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),             \
-                           GARROW_TYPE_FIELD))
-#define GARROW_FIELD_GET_CLASS(obj)             \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),             \
-                             GARROW_TYPE_FIELD, \
-                             GArrowFieldClass))
-
-typedef struct _GArrowField         GArrowField;
-typedef struct _GArrowFieldClass    GArrowFieldClass;
-
-/**
- * GArrowField:
- *
- * It wraps `arrow::Field`.
- */
-struct _GArrowField
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
+#define GARROW_TYPE_FIELD (garrow_field_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowField,
+                         garrow_field,
+                         GARROW,
+                         FIELD,
+                         GObject)
 struct _GArrowFieldClass
 {
   GObjectClass parent_class;
 };
 
-GType           garrow_field_get_type      (void) G_GNUC_CONST;
-
 GArrowField    *garrow_field_new           (const gchar *name,
                                             GArrowDataType *data_type);
 GArrowField    *garrow_field_new_full      (const gchar *name,
diff --git a/c_glib/arrow-glib/record-batch.h b/c_glib/arrow-glib/record-batch.h
index bd6a1ce..b01abf7 100644
--- a/c_glib/arrow-glib/record-batch.h
+++ b/c_glib/arrow-glib/record-batch.h
@@ -24,48 +24,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_RECORD_BATCH                \
-  (garrow_record_batch_get_type())
-#define GARROW_RECORD_BATCH(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_RECORD_BATCH, \
-                              GArrowRecordBatch))
-#define GARROW_RECORD_BATCH_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_RECORD_BATCH,    \
-                           GArrowRecordBatchClass))
-#define GARROW_IS_RECORD_BATCH(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_RECORD_BATCH))
-#define GARROW_IS_RECORD_BATCH_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_RECORD_BATCH))
-#define GARROW_RECORD_BATCH_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_RECORD_BATCH,  \
-                             GArrowRecordBatchClass))
-
-typedef struct _GArrowRecordBatch         GArrowRecordBatch;
-typedef struct _GArrowRecordBatchClass    GArrowRecordBatchClass;
-
-/**
- * GArrowRecordBatch:
- *
- * It wraps `arrow::RecordBatch`.
- */
-struct _GArrowRecordBatch
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
+#define GARROW_TYPE_RECORD_BATCH (garrow_record_batch_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowRecordBatch,
+                         garrow_record_batch,
+                         GARROW,
+                         RECORD_BATCH,
+                         GObject)
 struct _GArrowRecordBatchClass
 {
   GObjectClass parent_class;
 };
 
-GType garrow_record_batch_get_type(void) G_GNUC_CONST;
-
 GArrowRecordBatch *garrow_record_batch_new(GArrowSchema *schema,
                                            guint32 n_rows,
                                            GList *columns,
diff --git a/c_glib/arrow-glib/tensor.h b/c_glib/arrow-glib/tensor.h
index 6529282..2349dbb 100644
--- a/c_glib/arrow-glib/tensor.h
+++ b/c_glib/arrow-glib/tensor.h
@@ -24,40 +24,17 @@
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_TENSOR \
-  (garrow_tensor_get_type())
-#define GARROW_TENSOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), GARROW_TYPE_TENSOR, GArrowTensor))
-#define GARROW_TENSOR_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), GARROW_TYPE_TENSOR, GArrowTensorClass))
-#define GARROW_IS_TENSOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), GARROW_TYPE_TENSOR))
-#define GARROW_IS_TENSOR_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), GARROW_TYPE_TENSOR))
-#define GARROW_TENSOR_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS((obj), GARROW_TYPE_TENSOR, GArrowTensorClass))
-
-typedef struct _GArrowTensor         GArrowTensor;
-typedef struct _GArrowTensorClass    GArrowTensorClass;
-
-/**
- * GArrowTensor:
- *
- * It wraps `arrow::Tensor`.
- */
-struct _GArrowTensor
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
+#define GARROW_TYPE_TENSOR (garrow_tensor_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowTensor,
+                         garrow_tensor,
+                         GARROW,
+                         TENSOR,
+                         GObject)
 struct _GArrowTensorClass
 {
   GObjectClass parent_class;
 };
 
-GType           garrow_tensor_get_type           (void) G_GNUC_CONST;
-
 GArrowTensor   *garrow_tensor_new                (GArrowDataType *data_type,
                                                   GArrowBuffer *data,
                                                   gint64 *shape,