2011-08-15 87 views
5

假設我有下面的類:MATLAB - set/get訪問struct的字段?

classdef myClass 
    properties 
     Globals = struct(... 
      'G1', 1,  ... 
      'G2', 2  ... 
     ); 
    end 
    methods 
     % methods go here 
    end 
end 

我用的結構,因爲有那些結構等性能。

有什麼辦法可以爲結構體的字段提供setter嗎?天真提供

function obj = set.Globals.G1(obj, val) 
    obj.Globals.G1 = val; % for example 
end 

不起作用。

回答

4

您必須爲整個結構定義set-method(見下文)。或者,您可以爲「Globals」定義一個類,它的外觀和感覺像大多數實際用途的結構(除了不能拼錯字段名稱外),還可以爲其屬性實現自己的set/get方法。

function obj = set.Globals(obj,val) 

%# look up the previous value 
oldVal = obj.Globals; 

%# loop through fields to check what has changed 
fields = fieldnames(oldVal); 

for fn = fields(:)' %'# 
    %# turn cell into string for convenience 
    field2check = fn{1}; 

    if isfield(val,field2check) 
     switch field2check 
     case 'G1' 
     %# do something about G1 here 
     case 'G2' 
     %# do something about G2 here 
     otherwise 
     %# simply assign the fields you don't care about 
     obj.Globals.(field2check) = val.(field2check); 
     end 
    end 
end 
end %# function 
+0

這是我想到的,但我想我會問。我在Globals類中遇到的問題是我有幾個「對等」類,它們都繼承了Globals結構的要求,但是結構中的內容可能會有所不同。有沒有辦法創建動態setter/getters? 我剛剛學會了如何使用動態屬性 –

+1

@ strictlyrude27:如果超類定義了屬性,那麼它也必須定義set/get方法。然而,這些set/get方法可以調用例如稱爲「setGlobal」和「getGlobal」的方法,該方法又可以被重載。就我個人而言,我已經在類似情況下使用了動態屬性,但經驗表明,除非您確實需要動態屬性,否則最好不要冒險發現Matlab錯誤。 – Jonas

+0

所有我想要做的動態setters是做類型檢查 - 我的意圖是把這個對象作爲一個結構,而不是更多.. –