Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟C++;MATLAB中的模板 我试图找出创建C++模板或java通用对象的替代方法。我在过去出于几个不同的原因多次想这样做,但是现在我想做的是为几个相关的类创建saveobj和loadobj函数。我的想法是,我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它,以获得我想要的结构_Matlab_Matlab Class - Fatal编程技术网

模拟C++;MATLAB中的模板 我试图找出创建C++模板或java通用对象的替代方法。我在过去出于几个不同的原因多次想这样做,但是现在我想做的是为几个相关的类创建saveobj和loadobj函数。我的想法是,我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它,以获得我想要的结构

模拟C++;MATLAB中的模板 我试图找出创建C++模板或java通用对象的替代方法。我在过去出于几个不同的原因多次想这样做,但是现在我想做的是为几个相关的类创建saveobj和loadobj函数。我的想法是,我希望有一组通用的例程来创建一个默认结构,然后再进一步操作它,以获得我想要的结构,matlab,matlab-class,Matlab,Matlab Class,我不能简单地使用外部函数,因为我需要访问对象的所有公共(不是问题)和受保护(问题)非瞬态属性,以便创建loadobj和saveobj 然后我考虑使用一个抽象接口。然而,使用抽象接口给我留下了同样的问题;相同,复制在所有对象文件中浮动的粘贴代码。因此,我考虑使用某种完整的对象并结合多重继承(我的大多数对象已经从接口的基本具体化继承)。我认为使用超类可以让我公开子类受保护的属性,但它似乎不是这样工作的。有什么建议吗 这里是save-obj方法的多重继承方法的一个示例(到目前为止我所拥有的最接近的方法

我不能简单地使用外部函数,因为我需要访问对象的所有公共(不是问题)和受保护(问题)非瞬态属性,以便创建loadobj和saveobj

然后我考虑使用一个抽象接口。然而,使用抽象接口给我留下了同样的问题;相同,复制在所有对象文件中浮动的粘贴代码。因此,我考虑使用某种完整的对象并结合多重继承(我的大多数对象已经从接口的基本具体化继承)。我认为使用超类可以让我公开子类受保护的属性,但它似乎不是这样工作的。有什么建议吗

这里是save-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 )
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可能是构建类层次结构所用的最差语言,更不用说泛型了。