Зависимые свойства класса Matlab, которые могут хранить значения с помощью сеттеров
Свойства класса Matlab имеют следующие два ограничения, которые имеют отношение к моей проблеме,
- Зависимые свойства не могут хранить значения
- Установщик свойств (обычные свойства без заданных атрибутов, спецификаторы доступа и т. д.) не может получить доступ к другим свойствам.
В моем сценарии мне нужен обходной путь, который позволит мне иметь зависимое свойство, которое также может хранить значение. Зависимость от другого свойства предназначена только для условного оператора, а не для присвоения его значения самому другому свойству. Этот сценарий иллюстрируется приведенным ниже фрагментом кода, который также является моим требованием, которое 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