Можно ли скрыть методы, унаследованные от класса handle в matlab? - PullRequest
12 голосов
/ 08 июля 2011

Я работаю над приложением командной строки для ультразвукового моделирования в 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?

Ответы [ 4 ]

15 голосов
/ 24 октября 2012

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

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

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

classdef handle_light < handle
   methods(Hidden)
      function lh = addlistener(varargin)
         lh = addlistener@handle(varargin{:});
      end
      function notify(varargin)
         notify@handle(varargin{:});
      end
      function delete(varargin)
         delete@handle(varargin{:});
      end
      function Hmatch = findobj(varargin)
         Hmatch = findobj@handle(varargin{:});
      end
      function p = findprop(varargin)
         p = findprop@handle(varargin{:});
      end
      function TF = eq(varargin)
         TF = eq@handle(varargin{:});
      end
      function TF = ne(varargin)
         TF = ne@handle(varargin{:});
      end
      function TF = lt(varargin)
         TF = lt@handle(varargin{:});
      end
      function TF = le(varargin)
         TF = le@handle(varargin{:});
      end
      function TF = gt(varargin)
         TF = gt@handle(varargin{:});
      end
      function TF = ge(varargin)
         TF = ge@handle(varargin{:});
      end
      function TF = isvalid(varargin)
         TF = isvalid@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, который поддерживает порядок.

10 голосов
/ 08 июля 2011

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

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

2 голосов
/ 08 июля 2011

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

0 голосов
/ 23 мая 2016

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

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

m = setdiff(m,mH);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...