Еще один обходной путь для получения чего-то похожего на статические свойства - это использование факта, что код инициализации для переменных-членов выполняется только один раз при загрузке файла класса.Это означает, что если у вас есть определение типа
classdef foo
properties
stuff = some_function()
end
end
, то some_function
вызывается только один раз, и если он возвращает объект типа класса, он будет использоваться всеми экземплярами.Я добавил пример реализации, который показывает, как это можно использовать:
classdef ClassWithStaticMembers
properties
classvars = StaticVarContainer('foo', 0, 'bar', 2);
othervar
end
methods
function obj=ClassWithStaticMembers(var)
obj.othervar = var;
end
end
end
classdef StaticVarContainer < dynamicprops
methods
function obj=StaticVarContainer(varargin)
for i=1:2:numel(varargin)
obj.addprop(varargin{i});
obj.(varargin{i}) = varargin{i+1};
end
end
end
end
Если вы запустите этот пример кода
obj1 = ClassWithStaticMembers(3);
obj2 = ClassWithStaticMembers(5);
obj1.classvars.foo = [2,3];
obj1.othervar
obj1.classvars
obj2.othervar
obj2.classvars
, вы увидите, что classvars
действительнообщий.Я думаю, что это решение намного приятнее, чем использование постоянных переменных в функциях, поскольку вы можете использовать StaticVarContainer
столько раз, сколько захотите, его проще использовать, и, кроме того, вы непосредственно видите инициализацию статических переменных в разделе свойств.
Чтобы получить результат, который требуется в вопросе OP (т. Е. Реализовать счетчик объектов), общее свойство может быть задано Constant
, чтобы на него можно было ссылаться без экземпляра под рукой:
classdef ClassWithCounter
properties (Constant)
static = StaticVarContainer('counter', 0);
end
methods
function obj=ClassWithCounter()
obj.static.counter = obj.static.counter + 1;
end
end
end
clear all
obj1 = ClassWithCounter();
obj2 = ClassWithCounter();
obj3 = ClassWithCounter();
ClassWithCounter.static.counter
Обратите внимание, что атрибут Constant
означает только то, что, например, obj1.static
нельзя изменить, но он не влияет на obj1.static.counter
, который не является постоянным, и может быть установлен по желанию сердца.