Копируется автоматически при назначении с помощью matlab.mixins.Copyable - PullRequest
0 голосов
/ 05 сентября 2018

коротко-короткая версия

Возможно ли получить дескриптор для подкласса 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?

...