我决定回到GObject中关于GInterfaces的基础知识,所以我再次阅读基础教程。在this chapter中,您可以看到如何定义一个非常简单的GInterface。
如您所见,方法maman_ibaz_do_action
和maman_ibaz_do_something
的签名分别与符号_MamanIbazInterface.do_action
和_MamanIbazInterface.do_something
的签名相匹配。
但如果他们不这样做又会发生什么?我有一个现实世界的例子。 GInterface是 gpollableinputstream (source here)。该方法特别是read_nonblocking(),它在VT中有4个参数,但后来在头函数中有5个参数。
因此,如果此接口的实现者覆盖前者(real world example here),有人可以从其他类调用此实现吗?
答案 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);
接口的方法提供的功能不仅仅是这个,这是不寻常的,但除此之外,这里的一切都像往常一样。