2

我决定回到 GObject 中 GInterfaces 的基础知识,所以我又去阅读了基础教程。在本章中,您可以看到如何定义一个非常简单的 GInterface。

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

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

那么,如果这个接口的实现者覆盖了前者(这里是真实世界的例子),那么有人怎么能从其他类调用这个实现呢?

4

1 回答 1

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);
    

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

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

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

于 2014-08-06T15:23:47.173 回答