是否可以在matlab中隐藏从句柄类继承的方法?

时间:2011-07-08 08:26:07

标签: matlab

我正在使用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中是否可行?

4 个答案:

答案 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);