我正在使用MATLAB中的超声波仿真命令行应用程序。我们代码中的几乎每个对象都是句柄的子类(作为引用传递)。我遇到的问题是从句柄类继承的所有方法都出现在MATLAB的“方法”部分下(参见下面的例子)。
我想要的是隐藏handle类中的继承方法,以便只允许用户使用的函数显示在“Methods”下。这样,如果用户想知道使用哪种方法,它对用户来说就不那么混乱了。
示例测试类:
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中是否可行?
答案 0 :(得分:15)
如果重载隐藏方法块中的所有子类方法,我认为它将完全符合您的要求。
我不确定哪种版本的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类中,这样可以保持整洁。
答案 1 :(得分:10)
有一个解决方案here,包括示例代码。
简而言之,您需要做的是重载Matlab的内置函数methods
,以便在类上调用它时,它会从输出中删除handle
的方法。确保它适用于其他所有内容,但这样您就不会弄乱用户的其他代码。如果您不使用@foldername
变体来存储您的类,则可以将其放入private
目录中。例如。
答案 2 :(得分:2)
不是完整的解决方案,但是如果你做methods(T, '-full')
,那么它至少会告诉你哪些方法是从句柄继承的,所以你知道要忽略什么。
答案 3 :(得分:0)
只需从继承的类中获取函数,然后使用setdiff从主类中取消它们。
mH = methods('handle');
m = methods('MyClass');
m = setdiff(m,mH);