带有约束的classdef的Matlab构造

时间:2018-10-22 00:11:32

标签: matlab class oop methods encapsulation

我有这个

classdef what

properties ( ... )
  ...
end

methods (Access=public) 
  ...
end

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

构造函数中有很多约束,因此当我创建what时,如果不满足条件会失败,则通过调用Test1Test2来测试约束。

我也将测试函数存储在方法下,并且我希望将它们隐藏起来,以免它们出现在classdef之外。但是我为Test1Test2抛出了一个错误。

我希望这些Test函数是privatehidden,并且只与此类相关,但是我也希望在使用方法中的构造函数时,它们可以被调用,我的问题是:存储这些功能的“正确”位置和方法是什么

我现在在使用构造函数时遇到错误,但是,如果我在页面底部的classdef之外添加函数,则这些函数可以工作,但是我不确定这是否是一种好习惯,为什么我可以方法部分中没有测试功能。

1 个答案:

答案 0 :(得分:2)

有几种解决方法。

  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的mentioned一样,您也可以将函数放在classdef块之后:

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

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

  1. 为班级what命名可能不是一个好主意,因为这是builtin MATLAB function的名称。
  2. 虽然可以将private方法块设置为Hidden,但是通常不需要“隐藏” private方法,因为这些方法在外部不可见。还是上课。
  3. 我个人建议坚持使用某个naming convention(例如PascalJava)(这是指小写的类名,而不是“ Test”方法)是大写)。
  4. 如果您是MATLAB OOP的新手,则可能需要阅读Handle Classes