Matlab ООП вызывает метод get для сохранения временного свойства. - PullRequest
1 голос
/ 29 июля 2011

Я пытаюсь реализовать класс со свойством, которое может быть предоставлено конструктору или сгенерировано каким-либо другим методом.Я не хочу, чтобы данные сохранялись на диск или генерировались при загрузке.Пока что у меня есть:

classdef MyClass
        properties(GetAccess = public, SetAccess = private)
            Property1
            Property2
            Property3
        end
        properties(Access = private)
            Property4
        end
        properties(Transient = true)
            ProblemProperty
        end
        properties(Dependent = true, Transient = true)
            Property5
        end

        methods
            function MyClass
                % Constructor.
            end

            function val = get.Property5(B)
                val = SomeFunction(Property1);
            end

            function val = get.ProblemProperty(B)
                if isempty(B.ProblemProperty)
                    B = GenerateProblemProperty(B);
                end
                val = B.ProblemProperty;
            end

            function B = GenerateProblemProperty(B)
                B.ProblemProperty = AnotherFunction(B.Property2);
            end
        end
    end

Проблема в том, что когда я пытаюсь сохранить объект на диск, Matlab вызывает метод get.ProblemProperty (подтверждается запуском профилировщика только в операторе save).Поле ProblemProperty пустое, и я хочу, чтобы оно оставалось таким.Он не вызывает метод get.Property5.

Как мне избежать вызова get.ProblemProperty?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Ваше решение работает, но это не дух ООП, вы смешиваете аксессоры, которые имеют внешнюю форму объекта, с тем, что находится внутри.

Я бы посоветовал следующее

classdef simpleClass
    properties(Access = private)
        % The concrete container for implementation
        myNiceProperty % m_NiceProperty is another standard name for this.
    end
    properties(Dependent)
        % The accessor which is part of the object "interface"
        NiceProperty
    end

    method
        % The usual accessors (you can do whatever you wish there)
        function value = get.NiceProperty(this)
            value = this.myNiceProperty;
        end
        function set.NiceProperty(this, value)
            this.myNiceProperty = value;
        end
    end
end

При этом NiceProperty никогда нигде не сохраняется, и вы получаете преимущество написания стандартного кода.

1 голос
/ 29 июля 2011

Поскольку свойство иногда может быть установлено (то есть в конструкторе), это свойство не является строго зависимым.Одним из решений является сохранение устанавливаемого значения в частном свойстве (CustomProblemProperty в примере ниже) в конструкторе.get метод ProblemProperty затем проверит, вернет ли это значение частного свойства, если оно не пустое, и в противном случае вернет сгенерированное значение.

classdef MyClass
    properties(GetAccess = public, SetAccess = private)
        Property1
        Property2
        Property3
    end
    properties(Access = private)
        Property4
        CustomProblemProperty
    end
    properties(Dependent = true, Transient = true)
        ProblemProperty
        Property5
    end

    methods
        function B = MyClass(varargin)
            if nargin == 1
               B.CustomProblemProperty = varargin{1};
            end
        end

        function val = get.Property5(B)
            val = SomeFunction(Property1);
        end

        function val = get.ProblemProperty(B)
            if isempty(B.CustomProblemProperty)
               val = AnotherFunction(B.Property2);
            else
               val = B.CustomProblemProperty;
            end
        end

    end
end
...