【发布时间】:2013-06-19 00:01:32
【问题描述】:
我正在尝试找出创建替代 C++ 模板或 Java 通用对象的最佳方法。由于几个不同的原因,我过去曾多次想这样做,但是现在我想做的是为几个相关类创建 saveobj 和 loadobj 函数。我的想法是我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它以获得我想要的结构。
我不能简单地使用外部函数,因为我需要访问对象的所有公共(不是问题)和受保护(问题)非瞬态属性才能创建 loadobj 和 saveobj。
然后我考虑使用抽象接口。然而,使用抽象接口给我带来了同样的问题。相同,复制粘贴在我所有目标文件中的代码。因此,我想到了使用某种与多重继承相结合的成熟对象(我的大多数对象已经从接口的基本具体化继承)。我认为使用超类可以让我公开子类受保护的属性,但它似乎不是那样工作的。有什么建议吗?
这里是保存 obj 方法的多重继承方法(我目前最接近的方法)的示例。
序列化器.m
% Serializer.m
classdef Serializer
methods
function [saveObj] = saveobj( obj )
% Get metadata about the Object
meta = metaclass( obj );
meta = meta.PropertyList;
for p = meta'
if p.Transient | p.Dependent
continue; % Only serialize the correct fields
end
saveobj.(p.Name) = { obj.(p.Name) }; % Serialize
end % for ( property )
end % function ( saveobj )
end % methods
end % classdef ( Serializer )
TestSerializerA.m
% TestSerializerA.m
classdef TestSerializerA < Serializer
properties
PropA = 'a';
end % properties ( public )
properties( Access = protected )
HiddenA = 'ha'
end % properties ( protected )
end % classdef ( TestSerializerA )
TestSerializerB.m
% TestSerializerB.m
classdef TestSerializerB < TestSerializerA & Serializer
properties
PropB = 'b'
end
properties( Access = protected )
HiddenB = 'hb';
end % properties ( protected )
end % classdef ( TestSerializerB )
【问题讨论】:
-
我认为不可能覆盖 saveobj 并在具有非公共属性的整个层次结构中执行此操作。每个类都需要自己打包。
-
如果你的意思是因为
saveobj和loadobj是标准的内置函数,我想到了这一点。在我的开发代码中,我将其称为 Serialize 和 Deserialize,并从加载和保存函数中调用它们以防万一。你认为有办法使用非内置函数吗? -
没有。您将无法访问受保护的私有属性。
-
如果每个对象都自己打包,叶子应该调用父方法并打包。因此,如果您在每个级别都进行了序列化,则可以调用 superdata = serialize@
(obj);然后每个类都会有相同的模式。 -
MATLAB 可能是您可以选择用来构建类层次结构的最糟糕的语言,更不用说将它用于泛型了。
标签: matlab matlab-class