Предположим, у нас есть 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()
выполнялся толькострока "do other stuff" и Assert.doStuff()
также выполняет блок if isCalledFromAssertSubclass
.
Я хочу использовать статические методы, чтобы не создавать новый объект Assert всякий раз, когда мне нужноутверждают. Использование глобального объекта assert также очень уродливо и требует строки global assert
в каждой функции, которую я хочу использовать assert. Аналогично для проверок.
Итак, есть две проблемы:
- Поскольку это статические классы, нет никакой возможности использовать
class(obj)
или любое другое свойство или функцию нестатического класса. dbstack
не поддерживает наследование и всегда возвращает Check
в качестве вызывающего класса, также для Assert.doStuff
.
Я нашел рабочее решение, которое использует комбинациюdbstack
и dbtype
для чтения строки, из которой поступил вызов, т.е. строки, в которой написано Assert.doStuff()
. Однако он включает в себя две функции отладки, которые, вероятно, не должны использоваться в производительном коде, и более важен, dbtype очень медленный (в моем случае 30 наших из 70 секунд!).
Я мог бы вместо этого использовать пакет (каталог+Check
с файлами функций там) и создайте символическую ссылку +Assert -> +Check
. Тогда я мог бы проверить имя файла, но это а) не переносимо, б) довольно некрасиво и в) также несколько медлительно (я полагаю).
Есть ли более быстрый способ для этого?