Можно ли скрыть методы, унаследованные от класса 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?
Ответы
Ответ 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);