GObject中的Override(父类和子类的方法重写).

os posted @ 2013年9月11日 11:40 in GObject , 3774 阅读

gobjec相关学习文章的list.

 

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

 

Overload是重载,它用与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同。
Override 主要用于父类和子类之间的方法重写,即指定属性或方法可以在派生类中重写,其参数列表要求相同。

 

GobjectClass定义了一些Method:

static void
g_object_do_class_init (GObjectClass *class)
{
  /* read the comment about typedef struct CArray; on why not to change this quark */
  quark_closure_array = g_quark_from_static_string ("GObject-closure-array");

  quark_weak_refs = g_quark_from_static_string ("GObject-weak-references");
  quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references");
  pspec_pool = g_param_spec_pool_new (TRUE);
  property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue");
  property_notify_context.dispatcher = g_object_notify_dispatcher;

  class->constructor = g_object_constructor;
  class->constructed = g_object_constructed;
  class->set_property = g_object_do_set_property;
  class->get_property = g_object_do_get_property;
  class->dispose = g_object_real_dispose;
  class->finalize = g_object_finalize;
  class->dispatch_properties_changed = g_object_dispatch_properties_changed;
  class->notify = NULL;

 

子类可以重写(Override)父类的一些API:

比如:

GObject

    |_____GstObject

static void
gst_object_class_init (GstObjectClass * klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

  //.....

  //.....

  gobject_class->set_property = gst_object_set_property;
  gobject_class->get_property = gst_object_get_property;


  //....
  /* see the comments at gst_object_dispatch_properties_changed */
  gobject_class->dispatch_properties_changed
      = GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);

  gobject_class->dispose = gst_object_dispose;
  gobject_class->finalize = gst_object_finalize;

这一句比较重要:GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 

然后override了5个Method:

  gobject_class->set_property = gst_object_set_property;
  gobject_class->get_property = gst_object_get_property;
  gobject_class->dispatch_properties_changed = GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
  gobject_class->dispose = gst_object_dispose;
  gobject_class->finalize = gst_object_finalize;

 

再如:

GObject

     |_____GstObject

                   |______GstElement

static void
gst_element_class_init (GstElementClass * klass)
{
  GObjectClass *gobject_class = (GObjectClass *) klass;

  //.....
  //.....
  parent_class = g_type_class_peek_parent (klass);
  
  //.....
  //.....  

  gobject_class->dispose = gst_element_dispose;
  gobject_class->finalize = gst_element_finalize;


}

 

GObject

     |_____GstObject

                   |______GstElement

                                     |_____GstBin

static void
gst_bin_class_init (GstBinClass * klass)
{
  GObjectClass *gobject_class = (GObjectClass *) klass;



  gobject_class->set_property = gst_bin_set_property;
  gobject_class->get_property = gst_bin_get_property;

  gobject_class->dispose = gst_bin_dispose;

}

 

GObject

   |_____GstObject

                  |______GstElement

                                    |_____GstBin

                                                  |______GstPipeline

static void
gst_pipeline_class_init (GstPipelineClass * klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
  GstBinClass *gstbin_class = GST_BIN_CLASS (klass);

  g_type_class_add_private (klass, sizeof (GstPipelinePrivate));

  gobject_class->set_property = gst_pipeline_set_property;
  gobject_class->get_property = gst_pipeline_get_property;

  /**
   * GstPipeline:delay
   *
   * The expected delay needed for elements to spin up to the
   * PLAYING state expressed in nanoseconds.
   * see gst_pipeline_set_delay() for more information on this option.
   *
   * Since: 0.10.5
   **/
  g_object_class_install_property (gobject_class, PROP_DELAY,
      g_param_spec_uint64 ("delay", "Delay",
          "Expected delay needed for elements "
          "to spin up to PLAYING in nanoseconds", 0, G_MAXUINT64, DEFAULT_DELAY,
          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

  /**
   * GstPipeline:auto-flush-bus:
   *
   * Whether or not to automatically flush all messages on the
   * pipeline's bus when going from READY to NULL state. Please see
   * gst_pipeline_set_auto_flush_bus() for more information on this option.
   *
   * Since: 0.10.4
   **/
  g_object_class_install_property (gobject_class, PROP_AUTO_FLUSH_BUS,
      g_param_spec_boolean ("auto-flush-bus", "Auto Flush Bus",
          "Whether to automatically flush the pipeline's bus when going "
          "from READY into NULL state", DEFAULT_AUTO_FLUSH_BUS,
          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

  gobject_class->dispose = gst_pipeline_dispose;

 

 

per-object ——逐对象


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter