Зависимые свойства класса Matlab, которые могут хранить значения с помощью сеттеров

Свойства класса Matlab имеют следующие два ограничения, которые имеют отношение к моей проблеме,

  1. Зависимые свойства не могут хранить значения
  2. Установщик свойств (обычные свойства без заданных атрибутов, спецификаторы доступа и т. д.) не может получить доступ к другим свойствам.

В моем сценарии мне нужен обходной путь, который позволит мне иметь зависимое свойство, которое также может хранить значение. Зависимость от другого свойства предназначена только для условного оператора, а не для присвоения его значения самому другому свойству. Этот сценарий иллюстрируется приведенным ниже фрагментом кода, который также является моим требованием, которое Matlab не разрешает.

classdef foo
properties
    a
    b
end
properties (Dependent = true)
    c
end
methods
    function this = foo(c_init)
        a = 1;
        b = 1;
        this.c = c_init;
    end
    function this = set.c(this,value)
        if b==1
            c = value;
        else
            c = 1;
        end
    end
    function value = get.c(this)
        value = this.c;
    end
end
end

Есть ли обходной путь для вышеуказанного?

1 ответ

Решение

Прежде всего, вы, безусловно, можете иметь функцию набора свойств для доступа к значению другого свойства, просто это не полностью рекомендуется, так как действительность этого другого свойства неизвестна, особенно во время создания объекта. Это выдаст предупреждение. Также я полагаю, что если сеттер для зависимого свойства, то это предупреждение не присутствует.

Чтобы сделать то, что вы пытаетесь ("сохранить" значение в зависимом свойстве), вы можете создать "теневое" свойство для c который является частным и используется для хранения базовой стоимости c, В приведенном ниже примере я использовал c_ с подчеркиванием, чтобы указать, что это свойство тени.

 classdef foo
    properties
        a
        b
    end

    properties (Dependent = true)
        c
    end

    properties (Access = 'private')
        c_
    end

    methods
        function this = foo(c_init)
            this.a = 1;
            this.b = 1;
            this.c_ = c_init;
        end

        function this = set.c(this, value)
            if this.b ~= 1
                value = 1;
            end

            this.c_ = value;
        end

        function value = get.c(this)
            value = this.c_;
        end
    end
end

Также я не совсем уверен, является ли ваш пост слишком упрощенной версией того, что вы пытаетесь сделать, но для приведенного вами примера вы могли бы очень легко сделать c не зависимое свойство, а просто определить пользовательский установщик.

classdef foo
    properties
        a
        b
        c
    end

    methods
        function this = foo(c_init)
            this.a = 1;
            this.b = 1;
            this.c = c_init;
        end

        function this = set.c(this, value)
            if this.b ~= 1
                value = 1;
            end

            this.c = value;
        end
    end
end
Другие вопросы по тегам