假设我们有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
行。同样用于检查。
所以有两个问题:
class(obj)
或任何其他非静态类属性或函数。dbstack
不了解继承,并且总是为Check
也返回Assert.doStuff
作为调用类。我确实找到了一个可行的解决方案,该解决方案使用dbstack
和dbtype
的组合来读取调用来自的行,即它说Assert.doStuff()
的行。但是,它涉及两个调试功能,这些调试功能可能不应该在生产代码中使用,而更重要,dbtype非常慢(在我的情况下,是70秒的30秒!)。
我可以改用软件包(其中包含功能文件的目录+Check
)并创建符号链接+Assert -> +Check
。然后,我可以检查文件名,但这是a)不可移植的,b)很难看的,c)也有些慢(我想)。
有没有更快的方法?
Assert
的静态方法,并在完成后调用父方法?我相信这是使用继承的正常方法。您确实不希望Check
了解有关Assert
的任何信息。我相信它会像这样: