如何解决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);
}
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-max
中digital-min
和EdfSignal
的最小值/最大值,以便它们可以容纳EdfBdfSignal
使用的值。您可能会添加一个额外的只读属性,它给出digital-max
/digital-min
的位宽:EdfSignal
的值为 16,{{1} 的值为 24 }}。 - 将
EdfBdfSignal
更改为不派生自EdfBdfSignal
,而是并行实现。这两个类都会为通用功能实现一个接口,但该接口不会定义EdfSignal
/digital-min
属性。然后,这些属性的实现和范围可以在digital-max
和EdfSignal
中独立。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。