Подтвердить что ты не робот

Можно ли скрыть методы, унаследованные от класса handle в matlab?

Я работаю над приложением командной строки для моделирования ультразвука в MATLAB. Почти каждый объект в нашем коде является подклассом дескриптора (для передачи как ссылки). Проблема заключается в том, что все методы, унаследованные от класса handle, отображаются в разделе "Методы" в MATLAB (см. Пример ниже).

Я хочу скрыть унаследованные методы из класса дескриптора, так что только функция, которую пользователь может использовать, отображается в разделе "Методы" . Таким образом, он не выглядит настолько запутанным для пользователя, если он/она хочет знать, какие методы использовать.

Пример Класс тестирования:

classdef Test < handle
    methods
        function myFunction(obj)
        end
    end
end

В командной строке:

T = Test()

T = 

  Test handle with no properties.
  Methods, Events, Superclasses

После нажатия "Методы" :

Methods for class Test:

Test         delete       findobj      ge           isvalid      lt           ne           
addlistener  eq           findprop     gt           le           myFunction   notify

Что я хочу:

Methods for class Test:

Test         myFunction

Возможно ли это в MATLAB?

4b9b3361

Ответ 1

Существует решение здесь, включая пример кода.

Короче говоря, вам нужно перегрузить встроенную функцию Matlab methods, так что когда она вызывается в вашем классе, она удаляет методы handle из вывода. Убедитесь, что он работает на все остальное, хотя так, чтобы вы не испортили свой пользовательский другой код. Если вы не используете вариант @foldername для хранения своего класса, вы можете поместить его в каталог private, например.

Ответ 2

Если вы перегрузите все методы подкласса в блоке скрытых методов, я думаю, что он сделает именно то, что вы ищете.

Я не уверен, какие версии Matlab работают, но это определенно работает для меня в R2012b.

Исключением является isvalid, поскольку оно запечатано, поэтому вы не можете переопределить его в подклассе дескриптора.

classdef handle_light < handle
   methods(Hidden)
      function lh = addlistener(varargin)
         lh = [email protected](varargin{:});
      end
      function notify(varargin)
         [email protected](varargin{:});
      end
      function delete(varargin)
         [email protected](varargin{:});
      end
      function Hmatch = findobj(varargin)
         Hmatch = [email protected](varargin{:});
      end
      function p = findprop(varargin)
         p = [email protected](varargin{:});
      end
      function TF = eq(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = ne(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = lt(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = le(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = gt(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = ge(varargin)
         TF = [email protected](varargin{:});
      end
      function TF = isvalid(varargin)
         TF = [email protected]handle(varargin{:});
      end
   end
end

Если вы сохраните указанный класс в handle_light.m, а затем введите methods handle_light в командном окне, вы получите следующий результат:

Methods for class handle_light:

handle_light  isvalid  

Затем класс Test становится:

classdef Test < handle_light   
   methods
      function myFunction(obj)
      end
   end
end

Выполнение этого способа означает, что вам не нужно помещать перегрузки в класс Test, который сохраняет порядок вещей.

Ответ 3

Не полное решение, но если вы выполняете methods(T, '-full'), то он, по крайней мере, говорит вам, какие методы наследуются от дескриптора, поэтому вы знаете, что игнорировать.

Ответ 4

Просто получите функции из унаследованного класса и отмените их с помощью из основного класса с помощью setdiff.

mH = methods('handle');
m = methods('MyClass');

m = setdiff(m,mH);