0

私は、既存の MATLAB スクリプト コードを書き直さなければならない、より大きなプロジェクトの開始時です。私は、MATLAB のオブジェクト指向プログラミング サポートを使用して、より柔軟で堅牢なプログラムを作成するよう依頼されました。私は、さまざまなサブクラスのオブジェクトが通信できるようにする方法、またはそれを改善する方法を疑問に思ったところに到達しました。それを行うための最良または最もエレガント/効率的/ユーザーフレンドリーな方法は何ですか.

例:
スーパークラス A (ハンドル クラス):

classdef A < handle
  properties
    myvar
  end

  methods (Access = protected)
    function calc_myvar(obj)
      %calculate myvar with some code
      obj.myvar=...;
    end
  end
end

サブクラス B:

classdef B < A
  properties
    subclassvar
  end

  methods (Access = protected)
    function calc_subclassvar(obj)
      %calculate subclassvar with some code
      %needs myvar of an object of class C
      %C.myvar
      obj.subclassvar=...;
    end
  end
end

サブクラス C:

classdef C < A
  properties
    %some other properties
  end

  methods
    %some other methods
  end
end

したがって、サブクラス B には、A で定義されたサブクラス C の変数が必要です。現時点では、常に C のオブジェクトを追加の入力パラメーターとして関数に渡します。さらに、 C.myvar に既に値があるかどうかもわかりません。
現在の実装:

function calc_subclassvar(obj,C)
  if isempty(C.myvar)
    C.calc_myvar;
  end
  obj.subclassvar = do_something_with_C.myvar;
end

別のより良い方法はありますか?関数のオーバーロードについて読んだgetので、変数が存在するかどうかを毎回確認する必要はありませんか? また、イベントとリスナーについて読みましたが、満足に機能させることができませんでした。たとえば、リスナーを C に追加したい場合、A のどの特定のオブジェクトからイベントが送信されたかを知る必要があります。または、C が A の任意のオブジェクトをリッスンする方法はありますか?
別の方法を知っているかもしれません。ややこしいですね。=)

4

1 に答える 1

1

問題を少し複雑にしすぎていると思います。それとも、あなたが何を求めているのか完全には理解できません。

まず、コンストラクターを使用していません。通常、これらを使用して、インスタンス時に特定のクラスで必要なオブジェクトへの参照を渡します。第二に、あなたは B で必要なときに C が初期化されているかどうかわからないと書いています。私はそれをあなたのプログラムの構造の欠如と考えています。したがって、再構築タスクの一部がプログラムをより堅牢にすることである場合これは開始するのに適した場所です。それに対して本当に正当な理由がない限り、さまざまなオブジェクトがどの順序で初期化されているかを知ることができるはずです。上記で説明したようにコンストラクターを使用すると、例で B のインスタンスなしで C をインスタンス化できないため、これを考慮する必要があります。

以下は私のバージョンの B と C です。継承の必要性はこの問題にあまり関係がないので、A を除外しました。

クラス C:

classdef C < handle
   properties
       some_const = pi;

   end

   methods
      %some other methods
   end
end

クラス B:

classdef B < handle
   properties
      C_handle
   end

   methods (Access = public)
       function obj = B(C_handle)          
           obj.C_handle = C_handle;
       end
       function disp_c_var(obj)
           disp(obj.C_handle.some_const)
       end
   end
end

クラスの使用:

c_inst = C();
b_inst = B(c_inst);
b_inst.disp_c_var();

これで、以降の b_inst の使用はすべて c_inst への参照をすでに持っているため、再度渡す必要はありません。

于 2013-01-18T16:35:32.523 に答える