2012-10-03 66 views
1

在具有依賴屬性c的類中,我想用第三個參數調用c的setter,該參數等於'a''b',選擇要更改哪個獨立屬性以設置c用額外的參數調用setter? - MATLAB

的代碼是

classdef test < handle 
    properties 
     a 
     b 
    end 
    properties (Dependent = true) 
     c 
    end 

    methods 
     function c = get.c(obj) 
      c = obj.a + obj.b; 
     end 

     function obj = set.c(obj, value, varargin) 
      if(nargin == 2) 
       obj.a = value - obj.b; 
      end 

      if(nargin == 3 && argin(3) == 'a') % how do I enter this loop? 
       obj.a = value - obj.b; 
      end 

      if(nargin == 3 && argin(3) == 'b') % or this? 
       obj.b = value - obj.a; 
      end 

     end 
    end 
end 

此調用工作:

myobject.c = 5 

但我怎麼叫二傳手與第三參數等於'a''b'

回答

0

你不能。 set總是隻接受兩個參數。你可以解決它與一個額外的依賴屬性:

classdef test < handle 

    properties 
     a 
     b 
    end 

    properties (Dependent = true) 
     c 
     d 
    end 

    methods 
     function c = get.c(obj) 
      c = obj.a + obj.b; 
     end 
     function d = get.d(obj) 
      d = c; 
     end 

     function obj = set.c(obj, value)     
      obj.a = value - obj.b; 
     end 
     function obj = set.d(obj, value)     
      obj.b = value - obj.a; 
     end 

    end 
end 

,或者選擇不同的語法和/或處理方法:

myObject.set_c(5,'a') %// easiest; just use a function 
myObject.c = {5, 'b'} %// easy; error-checking will be the majority of the code 
myObject.c('a') = 5 %// hard; override subsref/subsasgn; good luck with that 

或別的東西,創意:)

+0

你也許能如果你重寫subsref – janh

+0

@janh:但是你不能使用像'myObject.c = 5'這樣的語法,你必須做一些非標準的,也許是不直觀的,比如'myObject.c('a')= 5 ' –

+0

afaik你不能重寫'set.c(obj)'Matlab不允許它。然而,正如你所指出的,你可以重寫subsref來模仿'set.c(obj,value)'。是的,你仍然需要像'myObject.c = {5,'b'}''。我使用'myObject.set_c'來解決Matlab不允許覆蓋子類中的getter的問題。所有說的,對象需要重構;) – janh