带约束的 classdef 的 Matlab 构造

Matlab construct of classdef with constraints

我有这个

classdef what

properties ( ... )
  ...
end

methods (Access=public) 
  ...
end

methods    
  function obj = what(...) ... end % constructor   
  function test = Test1() ... end    
  function test = Test2() ... end
end

构造函数中有很多约束,因此当我创建 what 时,如果不满足条件,它就会失败,通过调用 Test1 和 [=13= 来测试约束].

我也将测试函数存储在方法下,我希望将它们隐藏起来,以免它们出现在 classdef 之外。但是 Test1Test2.

出现错误

我希望这些 Test 函数是 privatehidden,并且只与此 class 有关,但我也希望它在使用时可以调用在方法中找到构造函数,我的问题是:存储这些函数的'correct' 位置和方法是什么

我目前在使用构造函数时遇到错误,但是,如果我在 classdef 之外的页面底部添加函数,那么这些函数会起作用,但我不确定这是否可行是一种很好的做法,也是为什么我不能在方法部分中使用测试函数的原因。

有几种方法可以解决这个问题。

  1. 一般来说,私有函数都放在methods (Access = private)块中。有时它们也可以设为静态,如果这有意义的话。私有方法也可以放在a separate folder.

    classdef what
    
    methods % no properties here
      function obj = what(varargin) % constructor
        ...
        out = obj.Test1(in); % object method calling example
        ...
      end
    end
    
    methods (Access = private)
      function tf = Test1(varargin)
        ...
      end
    
      % etc ...
    end
    
  2. 如果这些函数只被构造函数使用过,你可以让它们nested:

    classdef what
    
    methods % no properties here
      function obj = what(varargin) % constructor
        ...
        out = Test1(in); % no need for "obj" here
        ...
    
          function tf = Test1(varargin)
            ...
          end % Test1
      end % constructor
    end % methods
    
  3. 正如 Cris 的 ,您还可以将函数放在 classdef 块之后:

    classdef what
    ...
    end
    
    function tf = Test1(varargin)
    
    end
    

以上建议应该可以解决您的问题。现在还有一些其他评论:

  1. 将您的 class 命名为 what 可能不是一个好主意,因为这是 builtin MATLAB function.
  2. 的名称
  3. 虽然可以将 private 方法块设置为 Hidden,但通常不需要 "hide" private 方法,因为这些是无论如何在 class 之外是不可见的。
  4. 我个人建议坚持使用某个 naming convention (e.g. Pascal or Java)(这是指小写的 class 名称,而不是大写的 "Test" 方法)。
  5. 如果您是 MATLAB OOP 的新手,您可能需要阅读 Handle Classes