微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gobject 覆盖派生类中的属性

如何解决gobject 覆盖派生类中的属性

我正在尝试读取 EDF 格式的文件。 EDF 格式相当古老(1990 年代)。它存在一个 ASCII 格式的报头和来自不同传感器的大量样本;想想脑电图、心电图或其他类型的电极,其样本被转换为数字值。每个换能器称为一个信号。 EDF 样本采用小端 2s 补码 16 位样本。文件标题将说明存在哪些信号以及它们如何出现。

然而,随着时间的推移,已经设计了一种 EDF 方言,称为 BDF,它在很大程度上等同于 EDF,但它可以包含类似于 EDF 但具有 24 位精度的样本。

现在我正在尝试创建一个 GObject 风格的 EdfFile、Edfheader 和 EdfSignal 类。 BDF 等效项是 EdfBdfFile、EdfBdfheader 和 EdfBdfSigal。所有 BDF 文件都源自那里的 Edf 等价物。

EdfSignal 有两个我想在 EdfBdfSignal 中覆盖的属性,即 "digital-min""digital-max"

我正在尝试按如下方式执行此操作:

edf-signal.c:

static void
edf_signal_class_init(EdfSignalClass* klass)
{
    GObjectClass* object_class = G_OBJECT_CLASS(klass);

    object_class->set_property = edf_signal_set_property;
    object_class->get_property = edf_signal_get_property;
    object_class->dispose = edf_signal_dispose;
    object_class->finalize = edf_signal_finalize;

    klass->append_new_record = append_new_record;

    // A number of other properties here

    edf_signal_properties [PROP_DIGITAL_MIN] = g_param_spec_int(
            "digital-min","digital-minimum","The digital minimum of an signal",G_MININT16,G_MAXINT16,G_ParaM_READWRITE
            );

    edf_signal_properties [PROP_DIGITAL_MAX] = g_param_spec_int(
            "digital-max","digital-maximum","The digital maximum of an signal",G_ParaM_READWRITE
            );
    // Some more properties here.

    g_object_class_install_properties(
            object_class,N_PROPERTIES,edf_signal_properties
            );
}

我尝试覆盖派生类 edf-bdf-signal.c 中的属性

static void
edf_bdf_signal_class_init(EdfBdfSignalClass* klass)
{
    GObjectClass* object_class = G_OBJECT_CLASS(klass);
    object_class->set_property = set_property;
    object_class->get_property = get_property;
    EdfSignalClass* signal_class = EDF_SIGNAL_CLASS(klass);

    signal_class->append_new_record = append_new_record;

    // I would like to name these properties "digital-max" and
    // "digital-min" as well,but the gobject type system
    // doesn't like that.

    obj_properties[PROP_DIGITAL_MAX] = g_param_spec_int(
        "bdf-digital-max","Digital-Max","The digital maximum of a BdfFile.",-8388608,8388607,G_ParaM_READWRITE | G_ParaM_CONSTRUCT
        );

    obj_properties[PROP_DIGITAL_MIN] = g_param_spec_int(
        "bdf-digital-min","Digital-Min","The digital minimum of a BdfFile.",G_ParaM_READWRITE | G_ParaM_CONSTRUCT
    );

    g_object_class_override_property(object_class,PROP_DIGITAL_MAX,"digital-max");
    g_object_class_override_property(object_class,PROP_DIGITAL_MIN,"digital-min");

    g_object_class_install_properties(object_class,obj_properties);

}

如果我现在正在阅读 BDF 文件,我会偶然发现以下错误

ok 1 /BdfFile/create 保释! GLib-GObject-FATAL-WARNING:值 'gint' 类型的“-8388608”无效或超出属性范围 'gint' 类型的 'digital-min'

(/home/maarten/github/eeg-fft/debug/test/unittest:7085): GLib-GObject-WARNING **:11:22:30.745:“gint”类型的值“-8388608” 'gint' 类型的属性 'digital-min' 无效或超出范围

这告诉我我没有成功覆盖该属性。因为 -8388608 在 EdfBdfSignal 中应该是有效的,但在 EdfSignal 中无效。我希望知道是否可以这样做。

解决方法

您不需要 g_param_spec_int() 中的 edf_bdf_signal_class_init() 调用来覆盖属性 - 您只需要 g_object_class_override_property() 调用。

覆盖属性不允许您更改用于验证属性值的最大值/最小值,看起来您正在尝试这样做。如果你这样做,它会破坏类型系统:如果你有一个变量,它是 EdfBdfSignal 的一个实例,但是它被一些通用代码作为 EdfSignal 处理,那个通用代码如果它获得 digital-max 的值(例如),应该期望收到一个 16 位的值。不过,它最终可能会收到大于 16 位的值。

在不知道其余代码的结构的情况下,我无法自信地提出解决方案。我会考虑:

  • 放宽 digital-maxdigital-minEdfSignal 的最小值/最大值,以便它们可以容纳 EdfBdfSignal 使用的值。您可能会添加一个额外的只读属性,它给出 digital-max/digital-min 的位宽:EdfSignal 的值为 16,{{1} 的值为 24 }}。
  • EdfBdfSignal 更改为不派生自 EdfBdfSignal,而是并行实现。这两个类都会为通用功能实现一个接口,但该接口不会定义 EdfSignal/digital-min 属性。然后,这些属性的实现和范围可以在 digital-maxEdfSignal 中独立。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?