5

Matlab では、次のようにクラスを定義できます。

classdef klass < handle
    properties(Dependent)
        prop
    end
end

Matlab は、 のゲッターを定義しなくても、このクラスのオブジェクトをインスタンス化することに完全に満足していますprop。アクセスしようとしたときにのみ失敗します(当然のことです)。GetMethodプロパティの名前に基づいて動的に設定したいと思います。

残念ながら、プロパティが Dependent の場合でも、のmeta.propertyフィールドGetMethodは読み取り専用のままです。からの継承により、プロパティを追加dynamicpropsし、すべてのインスタンスでその GetMethod をプログラムで設定できるようになりますが、既存のプロパティを変更するために使用できるとは思えません。私はこのルートに行かなければならないかもしれませんが、すべてのオブジェクトに存在する必要があるため、クラスごとにゲッターを設定するだけです。そのようなことは可能ですか?prop

別の解決策として、何らかのキャッチオール方式を使用することもできます。他の言語では、これは Ruby ライクmethod_missingまたは PHP ライクの__get(). しかし、私の知る限り、Matlab には (文書化されているかどうかにかかわらず) アナログはありません。


(私の使用例: このクラスは多くのユーザー定義のサブクラスによって継承され、すべての依存プロパティは同様の方法でアクセスされ、プロパティ名に基づいて変更されるだけです。get.*共通コードへの呼び出しをラップするメソッドをユーザーに記述する代わりに、依存するプロパティのすべてについて、必要なメタデータを含む無名関数ポインタを使用して動的に設定したいと思います)。

4

2 に答える 2

2

これがあなたが望むものかどうかを確認してください。問題は、ユーザーが () を使用してプロパティを取得する必要があることです。これは非常に退屈かもしれませんが、とにかく、この方法で変数を変更できると思います。クラスで直接変更することはできませんが、必要に応じてオブジェクトのプロパティ値を変更できます。コンストラクターの値を変更する必要はありません。クラスによって継承される別の関数を使用して変更できます。

クラス1.m

classdef(InferiorClasses = {?klass2}) klass < handle

  methods
    function self = klass
      selfMeta = metaclass(self);
      names = {selfMeta.PropertyList.Name};
      for name = names
        switch name{1}
        case 'prop_child_1'
          self.(name{1}) = @newGetChild1PropFcn;
        case 'prop_child_2'
          self.(name{1}) = @newGetChild2PropFcn;
        end
      end
    end
  end
  methods(Static)
    function out = prop
      out = @defaultGetPropFcn;
    end
  end
end

function out = defaultGetPropFcn
  out = 'defaultGetPropFcn';
end

function out = newGetChild1PropFcn
  out = 'newGetChild1PropFcn';
end

function out = newGetChild2PropFcn
  out = 'newGetChild2PropFcn';
end

クラス2.m

classdef klass2 < klass
  properties
    prop_child_1 = @defaultGetChildPropFcn1
    prop_child_2 = @defaultGetChildPropFcn2
  end
  methods
    function self = klass2
      self = self@klass;
    end
  end
end

function out = defaultGetChildPropFcn1
  out = 'defaultGetChildPropFcn1';
end
function out = defaultGetChildPropFcn2
  out = 'defaultGetChildPropFcn2';
end

出力:

a = klass2
b=a.prop_child_1()


b =

newGetChild1PropFcn
于 2013-08-15T19:01:16.367 に答える