2011-08-15 6 views
5

は、私は以下のクラスがあるとします。MATLAB - 構造体のフィールドにアクセス権を設定/取得しますか?

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

構造体である他の特性があるので、私は構造体を使用しています。

構造体のフィールドにセッターを提供する方法はありますか?丁寧に提供する

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

は機能しません。

答えて

4

構造体全体のセットメソッドを定義する必要があります(下記参照)。あるいは、 "グローバル"のクラスを定義することができます。これは、実用的な目的のために構造のように見えるようになります(ただし、フィールド名を間違えることはできません)。

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クラスで実行する問題は、グローバルな構造体を持つという要件をすべて継承するいくつかの "ピア"クラスがありますが、構造体内には何が異なるかがあります。動的セッター/ゲッターを作成する方法はありますか? ダイナミックプロパティの使用方法を学んだばかりです。 –

+1

@ strictlyrude27:スーパークラスがプロパティを定義する場合は、set/getメソッドも定義する必要があります。しかし、これらのset/getメソッドは、例えば、 「setGlobal」および「getGlobal」と呼ばれるメソッドは、オーバーロードされる可能性があります。個人的には、私は似たような場合に動的プロパティを使いましたが、実際に動的プロパティが必要な場合を除いて、Matlabのバグを発見するリスクはない方が良いことが実証されています。 – Jonas

+0

ダイナミックセッターでやりたかったのは、型チェックを行うことでした。私の目的はこのオブジェクトを構造体として扱うことです。 –

関連する問題