Конструкция Matlab classdef с ограничениями - PullRequest
0 голосов
/ 22 октября 2018

У меня есть это

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 и Test2.

Я сохранил тестовые функции также в методах, и я хочу, чтобы они были скрыты, чтобы они не отображались за пределами classdef.но я получаю ошибку для Test1 и Test2.

Я хочу, чтобы эти Test функции были private, hidden и относились только к этому классу, но я также хочу, чтобыбыть способным к вызову при использовании функции конструктора, найденной в методах, мой вопрос: каково «правильное» место и метод для хранения этих функций .

В настоящее время я получаю сообщение об ошибке при использовании функции конструктора, однако, если я добавляю функции внизу страницы вне classdef, то функции работают, но я не уверен, что это хорошая практика ипочему я не могу иметь тестовые функции в разделе метода.

1 Ответ

0 голосов
/ 22 октября 2018

Есть несколько способов справиться с этим.

  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. Поскольку упоминается Крисом, вы можете также поставить функции после блока classdef:

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

Предложения, приведенные выше, должны решить вашу проблему.Теперь для некоторых других комментариев:

  1. Вероятно, это не глупая идея назвать ваш класс what, так как это имя встроенной функции MATLAB .
  2. Хотя для блока методов private можно установить значение Hidden, обычно это не требуется для того, чтобы «скрывать» методы private, так как они не видны вне классав любом случае.
  3. Я бы лично предложил придерживаться определенного соглашения об именах (например, Pascal или Java ) (это относится к имени классакоторый в нижнем регистре в отличие от методов «Test», которые в верхнем регистре).
  4. Если вы новичок в MATLAB OOP, вы можете прочитать о классах обработки .
...