【问题标题】:Is it possible to hide the methods inherited from the handle class in matlab?是否可以隐藏从matlab中的句柄类继承的方法?
【发布时间】:2026-01-04 00:45:02
【问题描述】:

我正在开发一个命令行应用程序,用于在 MATLAB 中进行超声仿真。几乎我们代码中的每个对象都是句柄的子类(作为引用传递)。我遇到的问题是从句柄类继承的所有方法都显示在 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 中可行吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    有一个解决方案here,包括示例代码。

    简而言之,你需要做的是重载Matlab的内置函数methods,这样当你的类调用它时,它会从输出中删除handle的方法。确保它适用于其他所有内容,但这样您就不会弄乱用户的其他代码。如果你不使用@foldername 变体来存储你的类,你可以把它放到一个private 目录中,例如。

    【讨论】:

    【解决方案2】:

    如果您在隐藏方法块中重载所有子类方法,我认为它会完全满足您的需求。

    我不确定这适用于哪个版本的 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 类中,这样可以保持整洁。

    【讨论】:

    • 完美!我将此(稍作修改)合并到我的matlab-utilities 中,这可能是复制/粘贴的更好格式,因为它具有归属...
    • @sage 太棒了!我很高兴其他人发现它有用。
    • 这个答案对我帮助很大,谢谢。尽管isvalid 出现在处理方法列表中,但有一件事 - 所以你可能想更新你的答案。
    • @magu_ 然后我得到Method 'isvalid' in class 'hidden_handle' conflicts with the Sealed method from the superclass definition in 'handle'.
    【解决方案3】:

    不是一个完整的解决方案,但如果你这样做methods(T, '-full'),那么它至少会告诉你哪些方法是从句柄继承的,所以你知道要忽略什么。

    【讨论】:

    • 感谢您的回答。这是一件好事,但不是我想要的。也许我应该在 OP 中更好地解释它。我这样做的主要原因是用户可以在类上使用自动完成功能,而无需从句柄中获取所有“无用”的东西。
    【解决方案4】:

    只需从继承类中获取函数,然后使用 setdiff 将它们与主类中的函数取消。

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

    【讨论】: