2016-02-17 6 views
0

свойства класса 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 

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

ответ

3

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

Чтобы сделать то, что вы пытаетесь («сохранить» значение в свойстве Dependent), вы можете создать свойство «shadow» для 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