如果GInterface方法签名与VirtualTable(struct)方法不匹配怎么办?

时间:2014-08-05 22:29:42

标签: c glib gobject gio

我决定回到GObject中关于GInterfaces的基础知识,所以我再次阅读基础教程。在this chapter中,您可以看到如何定义一个非常简单的GInterface。

如您所见,方法maman_ibaz_do_actionmaman_ibaz_do_something的签名分别与符号_MamanIbazInterface.do_action_MamanIbazInterface.do_something的签名相匹配。

但如果他们不这样做又会发生什么?我有一个现实世界的例子。 GInterface是 gpollableinputstream source here)。该方法特别是read_nonblocking(),它在VT中有4个参数,但后来在头函数中有5个参数。

因此,如果此接口的实现者覆盖前者(real world example here),有人可以从其他类调用此实现吗?

1 个答案:

答案 0 :(得分:0)

这里的代码有点不寻常,但基本上一切都按照您的预期进行。

要调用g_converter_input_stream_read_nonblocking,您可以

  • 通过GConverterInputStream实例的界面指针调用它:

    GConverterInputStream *my_gcis;
    
    ...
    
    bytes_read =
      G_POLLABLE_INPUT_STREAM_GET_INTERFACE (my_gcis)->
        read_nonblocking (my_gcis, buffer, count, error);
    

  • 通过接口方法g_pollable_input_stream_read_nonblocking调用它,它增加了第五个参数和一些额外的功能:

    bytes_read =
      g_pollable_input_stream_read_nonblocking (G_POLLABLE_INPUT_STREAM (my_gcis),
                                                buffer,
                                                count,
                                                cancellable,
                                                error);
    

第二种方法有效,因为内部 g_pollable_input_stream_read_nonblocking调用函数的正常“四参数”版本,由接口定义,gpollableinputstream.c:212

res = G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)->
  read_nonblocking (stream, buffer, count, error);

接口的方法提供的功能不仅仅是这个,这是不寻常的,但除此之外,这里的一切都像往常一样。