如何在超类的静态函数中获取调用子类的名称?

问题描述 投票:2回答:1

假设我们有Check.m:

classdef Check < handle
methods (Static)
    function doStuff()
        if isCalledFromAssertSubclass
            % do this stuff only if called as Assert.doStuff(), not if called as Check.doStuff()
        end
        % do other stuff
    end
end
end

和Assert.m:

classdef Assert < Check
    % nop
end

正如评论中所写,我希望Check.doStuff()仅执行“其他操作”行,并且Assert.doStuff()也执行if isCalledFromAssertSubclass块。

我想使用静态方法,这样我就不需要在需要断言时创建Assert对象。使用全局断言对象也很丑陋,并且在我要使用断言的每个函数中都需要一个global assert行。同样用于检查。

所以有两个问题:

  1. 由于这些是静态类,所以没有机会使用class(obj)或任何其他非静态类属性或函数。
  2. [dbstack不了解继承,并且总是为Check也返回Assert.doStuff作为调用类。

我确实找到了一个可行的解决方案,该解决方案使用dbstackdbtype的组合来读取调用来自的行,即它说Assert.doStuff()的行。但是,它涉及两个调试功能,这些调试功能可能不应该在生产代码中使用,而更重要,dbtype非常慢(在我的情况下,是70秒的30秒!)。

我可以改用软件包(其中包含功能文件的目录+Check)并创建符号链接+Assert -> +Check。然后,我可以检查文件名,但这是a)不可移植的,b)很难看的,c)也有些慢(我想)。

有没有更快的方法?

matlab oop inheritance static-methods introspection
1个回答
0
投票
如何重载Assert的静态方法,并在完成后调用父方法?我相信这是使用继承的正常方法。您确实不希望Check了解有关Assert的任何信息。我相信它会像这样:
© www.soinside.com 2019 - 2024. All rights reserved.