首页 > 解决方案 > 具有约束的classdef的Matlab构造

问题描述

我有这个

classdef what

properties ( ... )
  ...
end

methods (Access=public) 
  ...
end

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

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

我也将测试函数存储在方法下,我希望将它们隐藏起来,这样它们就不会出现在classdef. 但我得到了一个错误Test1and Test2

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

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

标签: matlabclassoopmethodsencapsulation

解决方案


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

  1. 通常,私有函数放置在methods (Access = private)块内。如果有意义的话,有时也可以将它们设为静态。私有方法也可以放在单独的文件夹中。

    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. 如果这些函数仅由构造函数使用,则可以将它们嵌套

    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. 命名您的类可能不是一个好主意what,因为这是内置 MATLAB 函数的名称。
  2. 虽然可以将private方法块设置为Hidden,但为了“隐藏”private方法,通常不需要这样做,因为无论如何这些方法在类之外都是不可见的。
  3. 我个人建议坚持一定的命名约定(例如PascalJava)(这是指小写的类名,而不是大写的“Test”方法)。
  4. 如果您是 MATLAB OOP 的新手,您可能想了解Handle Classes

推荐阅读