коротко-короткая версия
Возможно ли получить дескриптор для подкласса Copyable
вместо получения копии?
Контекст
У меня есть иерархия классов, которую я хочу иметь Copyable
.
classdef A < matlab.mixins.Copyable
properties
stuff;
end
methods
function action(self)
% ...
end
end
end
Различные подклассы обеспечивают вариации основного поведения, а конкретный подкласс работает для объединения нескольких из этих значений для последовательного применения
classdef multiA < classA
properties
nElements = 1;
elements;
iElement = 0;
currentElement;
end
methods
function self = multiA()
end
function addElement(self, fhdl)
if self.nElements == 0
self.nElements = 1;
self.elements = {fhdl}; % Store handles to constructors
else
self.nElements = self.nElements + 1;
self.elements(self.nElements) = fhdl; % Store handles to constructors
end
end
function nextElement(self)
if self.iElement < self.nElements
self.iElement = self.iElement + 1;
fhdl = self.elements(self.iElement);
self.element = fhdl(); % instantiate with constructors
end
end
function action(self)
if self.iElement > 0 && self.iElement <= self.nElements
self.currentElement.action(); % Pass use request to constructed objects
end
end
end
end
Ожидается, что пользователь будет создавать объекты с помощью addElement
и обрабатывать список с помощью nextElement
, вызывая поведение содержащихся объектов по мере необходимости с помощью `action.
multi = multiA();
multi.addElement( @OneSubClass );
multi.addElement( @AnotherSubClass );
multi.addElement( @ThirdSubClass );
% ...
multi.nextElement();
multi.action();
Проблема возникает
Класс multiA
проходит некоторые базовые юнит-тесты, и я начал пытаться его применять. И это, похоже, работает. Затем я получаю ситуацию, когда multi.action()
, кажется, непредсказуемо переключается между двумя поведениями.
Кажется маловероятным, но просто возможно, что объект типа OneSubClass
застрял после того, как я перешел к AnotherSubClass
.
(неправильное?) Решение
Напишите модульный тест, который фиксирует дескриптор каждого элемента в момент его создания и проверяет, остается ли он в использовании, пока не будет создан следующий. Что-то вроде:
multiA.nextElement();
ehdl = multiA.currentElement;
% do things
testCase.veriftySameHandle(multiA.currentElement,ehdl);
Увы, ehdl
представляется копией хранимого элемента, а не его дескриптором, хотя я явно не вызывал copy()
. (Я говорю это, потому что ehdl
сохраняет состояние содержащегося объекта во время nextElement()
, тогда как новый доступ к currentElement
показывает ожидаемые изменения.)
Есть ли способ принудительно удерживать дескриптор объекта, полученного из matlab.mixins.Copyable
?