Matlab 如何获取调用子类&x27;超类中的名称';静态功能?

Matlab 如何获取调用子类&x27;超类中的名称';静态功能?,matlab,oop,inheritance,static-methods,introspection,Matlab,Oop,Inheritance,Static Methods,Introspection,假设我们有 检查。m: classdef检查

假设我们有 检查。m:

classdef检查
和Assert.m:

classdef Assert < Check
    % nop
end
classdef断言
如评论中所述,我希望
Check.doStuff()
只执行“do other stuff”行,而
Assert.doStuff()
也执行
if isCalledFromAssertSubclass

我想使用静态方法,这样我就不需要在需要Assert时创建Assert对象。使用全局断言对象也是非常难看的,在我想要使用断言的每个函数中都需要一个
global assert
行。支票也是如此

因此有两个问题:

  • 由于这些是静态类,因此不可能使用
    class(obj)
    或任何其他非静态类属性或函数
  • dbstack
    不支持继承,总是将
    Check
    作为调用类返回,也用于
    Assert.doStuff
  • 我确实找到了一个有效的解决方案,它使用了
    dbstack
    dbtype
    的组合来读取调用来自的行,也就是说,
    Assert.doStuff()
    。然而,它涉及两个调试函数,这两个函数可能不应该在生产代码中使用,更重要的是,dbtype非常慢(在我的例子中,是30秒还是70秒!)

    我可以使用一个包(目录
    +Check
    ,其中包含函数文件)并创建一个符号链接
    +Assert->+Check
    。然后我可以检查文件名,但是a)不可移植,b)非常难看,c)也有点慢(我想)


    有更快的方法吗?

    为什么不为
    Assert
    重载静态方法,并让它在完成后调用父方法?这是使用继承的正常方式:您不想让父级,
    检查
    ,了解其子级,
    断言

    这就是它的样子:

    classdef断言

    如上所述,只要
    Check.doStuff
    未密封,上述功能就可以工作。不能重载密封的方法。请参阅。

    这是一种静态方法,这一要求使这一点变得更加困难。。。如果不是的话,你可以有一个简单的重载。我认为这是一个重复:是的,但这就是重点。拥有资产需要尽可能的非侵入性。在能够使用断言之前创建对象太笨拙了。如果我正确地编译了链接问题的答案,它就不是真正的重复。如果我需要为超类中的每个函数在子类中编写一个小函数,我可以只编写Check.duStuff()(请参阅答案)。还是我看错了?似乎没有内置的会议方法。请参阅Cris Lunego的答案,了解可能在大多数情况下都有效的解决方法(包括我的)。如果Cris解决了您的问题,请将他们的答案标记为已接受,以使其成立,我想引用
    子类可以重新定义静态方法的这句话,除非该方法的Sealed属性在超类中也设置为true
    ——我假设相反,使这个问题过于复杂,看起来你的解决方案应该有效。@Wolfie:谢谢你提供的详细信息,我已经在答案中包含了它。是的,这就是我最后写的东西。我同意这可能是最干净的解决方案。然而,其目的是不必为每个断言/检查例程维护两个函数(目前我有48个…)。使用慢速dbtype解决方案,我只需为每个检查编写一个函数。@Tasnad:两个较小的函数,而不是一个较大的函数,并且没有重复的代码。每个检查函数中只有一行“check.handleAssert()”,但我仍然认为这样更干净。通过这种方式,我可以将抛出错误的功能与检查功能分开,这就更好了。然而,这仍然不能回答最初的问题:)似乎没有合适的内置方法来确定类名。。。
    classdef Assert < Check
        % nop
    end