Main Content

プロパティの get メソッドおよび set メソッド

関連プロパティにアクセスされるたびに MATLAB® が自動的に呼び出すプロパティの get メソッドおよび set メソッドを定義できます。get メソッドまたは set メソッドを特定のプロパティに関連付けるには、それぞれ get.PropertyName および set.PropertyName という形式を使用して get メソッドおよび set メソッドを指定します。

get メソッドおよび set メソッドでは、プロパティにアクセスするだけではなく、それ以上の追加ステップを実行できます。次の場合に get メソッドを使用します。

  • 依存プロパティの値を計算する。

  • ユーザーに表示するのとは異なる形式でデータを保存する。

次の場合に set メソッドを使用します。

  • 組み込みの検証手法でサポートされるより複雑なプロパティ検証を設計する。

  • カスタム エラー メッセージを発行する。

  • ハードウェア デバイスとの接続の確立や更新、ファイルを開く操作など、プロパティ値変更の直接の結果であるアクションを実行して、リソースへのアクセスを確保する。

get メソッドおよび set メソッドにより、クラスにオーバーヘッドが追加されます。頻繁にアクセスするプロパティの get メソッドおよび set メソッドで計算負荷の高い複雑な操作は行わないでください。

メモ

このトピックで説明している get メソッドおよび set メソッドを直接呼び出すことはできません。MATLAB は、プロパティ値にアクセスするときにこれらのメソッドを自動的に呼び出します。ユーザーによる呼び出しが可能な get メソッドおよび set メソッドの実装の詳細については、プロパティの Set/Get インターフェイスの実装を参照してください。

プロパティの get メソッド

関連プロパティ値がクエリされるたびに MATLAB が自動的に呼び出す get メソッドを定義できます。get メソッドはプロパティ値を返す必要があります。get メソッドでは次の構文使用します。ここで、PropertyName はプロパティの名前です。

methods 
   function value = get.PropertyName(obj)
      ...
   end
end

get メソッドまたは set メソッドを定義しているメソッド ブロックでは属性を指定できません。

たとえば、triangleArea クラスは Area プロパティの get メソッドを定義します。Area は依存プロパティとして定義されます。つまり、値を保存しません。Area の get メソッドはオンデマンドで値を計算します。(依存プロパティの詳細については、依存プロパティの get メソッドおよび set メソッドを参照してください。)

classdef triangleArea
   properties
      Base = 1
      Height = 1
   end
   properties (Dependent)
      Area
   end
   methods
      function a = get.Area(obj)
         disp("Executing get.Area method.")
         a = 0.5*obj.Base*obj.Height;
      end
   end
end

triangleArea のインスタンスを作成します。

a = triangleArea
a = 

Executing get.Area method.
  triangleArea with properties:

      Base: 1
    Height: 1
      Area: 0.5000

オブジェクトを表示する際に、MATLAB は表示するプロパティの定義されている get メソッドを呼び出します。ここでは、get.Area を呼び出し、Base および Height の既定値に基づいて Area の値を計算します。get メソッドでエラーが発生した場合は、MATLAB はそのエラーを非表示にし、そのプロパティを表示しません。

Base および Height の値を変更し、Area に再度アクセスします。

a.Base = 3;
a.Height = 4;
a.Area
Executing get.Area method.

ans =

     6

get メソッドの使用法

  • get メソッドは再帰的に呼び出されません。

  • 値オブジェクト (つまり、handle クラスから派生したものではないもの) をコピーする場合、あるオブジェクトから他のオブジェクトにプロパティ値をコピーするときには get メソッドは呼び出されません。

プロパティ の set メソッド

関連プロパティ値に値が代入されるたびに MATLAB が自動的に呼び出す set メソッドを定義できます。set メソッドは、クラスが値クラスまたはハンドル クラスのいずれであるのかに応じて、以下の構文を使用します。

  • 値クラスの set メソッドは、変更されたオブジェクトを返さなければなりません。

    methods 
       function obj = set.PropertyName(obj,value) 
          ...
       end
    end
  • ハンドル クラスの set メソッドは、変更されたオブジェクトを返す必要はありません。

    methods 
       function set.PropertyName(obj,value) 
          ...
       end
    end

get メソッドまたは set メソッドを定義しているメソッド ブロックでは属性を指定できません。

たとえば、symPosDef はプロパティ検証用に set メソッドを使用します。inputMatrix プロパティが新しい値に設定されると、set メソッドは関数 chol を呼び出して、入力行列が対称正定値かどうかを判別します。そうである場合、メソッドは inputMatrix をその値に設定します。そうでない場合、メソッドはカスタム エラー メッセージを返します。

classdef symPosDef
  properties
     inputMatrix = [1 0; 0 1]
  end
  methods
    function obj = set.inputMatrix(obj,val)
      try chol(val)
         obj.inputMatrix = val;
      catch ME
         error("inputMatrix must be symmetric positive definite.")
       end
     end
  end
end

symPosDef のインスタンスを作成し、inputMatrix を対称正定値行列ではない値に設定しようとします。

s = symPosDef;
s.inputMatrix = [1 2; 1 1]
Error using symPosDef/set.inputMatrix
inputMatrix must be symmetric positive definite.

set メソッドの使用法

  • set メソッドは再帰的に呼び出されません。

  • オブジェクトの初期化中に既定値をプロパティに代入するときに、MATLAB は set メソッドを呼び出しません。ただし、コンストラクターでプロパティ値を設定する際には set メソッドを呼び出します。

  • オブジェクトが読み込まれたときに MATLAB は set メソッドを呼び出します。

  • MATLAB が値オブジェクト (つまり、handle でない任意のオブジェクト) をコピーする場合、あるオブジェクトから別のオブジェクトにプロパティ値をコピーするときに set メソッドは呼び出されません。

  • AbortSet 属性を true にしてプロパティを定義した場合、現在の値と同じ値を代入する際にそのプロパティの set メソッドは呼び出されません。ただし、プロパティに get メソッドがある場合には、値を比較できるようにそのメソッドが呼び出されます。この属性の詳細については、プロパティ値が変化しない場合の代入を参照してください。

関連するトピック