模拟C++;MATLAB中的模板 我试图找出创建C++模板或java通用对象的替代方法。我在过去出于几个不同的原因多次想这样做,但是现在我想做的是为几个相关的类创建saveobj和loadobj函数。我的想法是,我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它,以获得我想要的结构
我不能简单地使用外部函数,因为我需要访问对象的所有公共(不是问题)和受保护(问题)非瞬态属性,以便创建loadobj和saveobj 然后我考虑使用一个抽象接口。然而,使用抽象接口给我留下了同样的问题;相同,复制在所有对象文件中浮动的粘贴代码。因此,我考虑使用某种完整的对象并结合多重继承(我的大多数对象已经从接口的基本具体化继承)。我认为使用超类可以让我公开子类受保护的属性,但它似乎不是这样工作的。有什么建议吗 这里是save-obj方法的多重继承方法的一个示例(到目前为止我所拥有的最接近的方法) 序列化程序.m模拟C++;MATLAB中的模板 我试图找出创建C++模板或java通用对象的替代方法。我在过去出于几个不同的原因多次想这样做,但是现在我想做的是为几个相关的类创建saveobj和loadobj函数。我的想法是,我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它,以获得我想要的结构,matlab,matlab-class,Matlab,Matlab Class,我不能简单地使用外部函数,因为我需要访问对象的所有公共(不是问题)和受保护(问题)非瞬态属性,以便创建loadobj和saveobj 然后我考虑使用一个抽象接口。然而,使用抽象接口给我留下了同样的问题;相同,复制在所有对象文件中浮动的粘贴代码。因此,我考虑使用某种完整的对象并结合多重继承(我的大多数对象已经从接口的基本具体化继承)。我认为使用超类可以让我公开子类受保护的属性,但它似乎不是这样工作的。有什么建议吗 这里是save-obj方法的多重继承方法的一个示例(到目前为止我所拥有的最接近的方法
% 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 )
testra.m
% TestSerializerA.m
classdef TestSerializerA < Serializer
properties
PropA = 'a';
end % properties ( public )
properties( Access = protected )
HiddenA = 'ha'
end % properties ( protected )
end % classdef ( TestSerializerA )
%TestSerializerA.m
classdef TestSerializer<序列化程序
性质
普罗帕=‘a’;
结束%properties(公共)
属性(访问=受保护)
希德纳=‘哈’
结束%properties(受保护)
结束%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 )
%TestSerializerB.m
classdef TestSerializerB
解决方案
通过使用,您可以完成您希望完成的任务。您可以允许序列化程序
类访问任何要序列化的受保护/私有类成员。这允许每个类自行确定序列化其哪些成员。由于您允许访问序列化程序
,因此不希望从中继承。如果您这样做,继承权中的所有类都可以访问这些成员。下面是重写的序列化程序
类:
classdef Serializer
methods
function SerializedObj = serialize(~, 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
try
SerializedObj.(p.Name) = { Obj.(p.Name) }; % Serialize
catch Me
% the class has chosen not to allow this property to be
% serialized. decide how to handle it.
if ~strcmp(Me.identifier, 'MATLAB:class:GetProhibited')
Me.rethrow()
end
end
end
end
end
end
请注意,您可以决定如何处理访问限制。在上面的例子中,我什么也不做。但是你可以发出警告,抛出错误,等等
现在,不要从序列化程序
继承,而是创建一个抽象的可序列化的
类,该类将启用序列化
classdef (Abstract) Serializable
properties (Access = private)
Serializer_ = Serializer()
end
methods
function savedObj = saveobj(This)
savedObj = This.Serializer_.serialize(This);
end
end
end
现在,您希望启用序列化的任何类都将从Serializable
继承。您可以指定序列化程序
有权访问哪些受保护/私有成员
例子
下面的类有两个可序列化属性和一个隐藏(不可序列化)属性
classdef TestSerializerA < Serializable
properties
PropA = 'a';
end
properties( Access = {?TestSerializerA, ?Serializer} )
% This property is protected and serializable
SerializableA = 'sa'
end
properties (Access = private)
% This property is private and not serializable
HiddenA = 'ha';
end
end
classdef TestSerializerB < TestSerializerA & Serializable
properties
PropB = 'b';
end
properties (Access = {?TestSerializerB, ?Serializer})
% This property is protected and serializable.
SerializableB = 'sb';
end
properties (Access = protected)
% This property is protected and not serializable.
HiddenPropB = 'hb';
end
end
下一个示例继承自TestSerializerA
,并具有另外两个可序列化属性和一个隐藏属性
classdef TestSerializerA < Serializable
properties
PropA = 'a';
end
properties( Access = {?TestSerializerA, ?Serializer} )
% This property is protected and serializable
SerializableA = 'sa'
end
properties (Access = private)
% This property is private and not serializable
HiddenA = 'ha';
end
end
classdef TestSerializerB < TestSerializerA & Serializable
properties
PropB = 'b';
end
properties (Access = {?TestSerializerB, ?Serializer})
% This property is protected and serializable.
SerializableB = 'sb';
end
properties (Access = protected)
% This property is protected and not serializable.
HiddenPropB = 'hb';
end
end
我希望这有帮助 我认为不可能覆盖saveobj并在具有非公共属性的整个层次结构中执行它。每个类都需要自己打包。如果你的意思是因为
saveobj
和loadobj
是一个标准的内置函数,我就想到了这一点。在我的开发代码中,我将其称为序列化和反序列化,并从load和save函数中调用它们以防万一。您认为有没有一种方法可以使用非内置函数来完成此操作?没有。您将无法访问受保护的和私有的属性。如果每个对象都自行打包,则叶应该调用父方法并对其进行打包。因此,如果您在每个级别都进行了序列化,那么可以调用superdata=serialize@(obj);然后每个类都会有相同的模式。MATLAB可能是构建类层次结构所用的最差语言,更不用说泛型了。