2

我想要一个类似于 Matlab 的 OOP 接口,在某种程度上我有类似的东西

classdef Foo
 properties (Constant)
  dict = NaN;
 end
 methods (Static)
  function list = search(varargin)
   %...
   Foo.dict = cell(10,5); % etc..
  end
 end
end

所以我可以访问和修改(静态)属性。我应该如何设置它?不是Constant我猜..

更新:我的问题是t9.load();不更新t9.dict

classdef t9
    %T9 Summary of this class goes here
    %   Detailed explanation goes here

    properties% (Static)
        dict = {};
    end

    methods (Static)
        function load()
            load('usdict.mat');
            t9.dict = usdict;
        end
        function matches = search(varargin)
            matches = {};
            num_words = nargin-1;
            for word=t9.dict(num_words, :)
                if strcmp(word,'')
                    continue;
                end
                word_cell = word{1};
                success = true;
                for i=1:num_words
                    char = word_cell(i);
                    if ~ismember(char, varargin{i})
                        success = false;
                    end
                end
                if success, matches{end+1} = word_cell; end
            end
        end
    end

end

愿望:

t9.load();
t9.search('ABC', 'DEF');
t9.search('DEF', 'GHI', 'MNO');
4

3 回答 3

2

我将维护dict为一个 Dependent 属性,并让它引用一个包含静态数据的持久变量,如下所示。有了这个,您可以更新dict,使用构造函数或直接使用对象实例设置它。所有实例都将共享您赋予它的任何值,即使从 .mat 文件加载也是如此。

 classdef myclass

 properties (Dependent) 
     dict   
 end

 methods

     function obj=set.dict(obj,val)

          manageDict('set',val);

     end

     function val=get.dict(obj)

         val=manageDict('get');

     end

     function obj=myclass(dict)

         obj.dict=dict;


     end

 end

end


function varargout=manageDict(op,newdict)

   persistent dictStatic;

   switch op

       case 'get'

           varargout{1}=dictStatic;

       case 'set'    

           dictStatic=newdict;

   end


end
于 2014-02-06T15:51:54.957 回答
1

如果您永远不会添加到字典中,那么最简单的方法是将字典加载为常量属性。

classdef t9
    properties (Constant)
        dict = i_loadDict()
    end
    ...
end

function out = i_loadDict()
    load('usdict.mat');
    out = usdict;
end

有一些方法可以更新一些东西,但这是解决您的问题的最简单的方法。

于 2014-02-06T14:56:08.077 回答
1

我真的不明白你为什么要避免有一个实例......为什么不使用这个:

T = t9;
T.load(); %// taken care of by constructor?

T.search('ABC', 'DEF');
T.search('DEF', 'GHI', 'MNO');

clear T

而不是你的愿望清单?classdef: _

classdef t9
    %T9 Summary of this class goes here
    %   Detailed explanation goes here

    properties
        dict = {};
    end

    methods %// note: NOT static

        function load(obj)
            load('usdict.mat');
            obj.dict = usdict;
        end

        function matches = search(obj, varargin)
            matches = {};
            num_words = nargin-1;
            for word=obj.dict(num_words, :)
                if strcmp(word,'')
                    continue;
                end
                word_cell = word{1};
                success = true;
                for i=1:num_words
                    char = word_cell(i);
                    if ~ismember(char, varargin{i})
                        success = false;
                    end
                end
                if success, matches{end+1} = word_cell; end
            end
        end
    end

end
于 2014-02-06T15:05:01.250 回答