ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

プロパティ アクセス メソッド

プロパティによるクラス データへのアクセスの指定

MATLAB® では、プロパティにパブリック アクセスを指定できます。したがって、プロパティはクラス設計によってユーザーに公開されるデータへのアクセスを提供できます。

プロパティ アクセス メソッドを使用して、エラー チェックを行ったり、プロパティ アクセスから生じる副次的影響を実装したりすることができます。アクセス メソッドの例として、プロパティの設定時に他のプロパティ値を更新したり、値を返す前にプロパティ値の形式を変換したりする関数があります。

アクセス メソッドのパフォーマンスの考慮事項

プロパティ アクセス メソッドでは、プロパティ値にアクセスするときに必ず関数呼び出しによる追加のオーバーヘッドが発生します。パフォーマンスに影響を及ぼすプロパティ アクセスがクラスのメソッド内で発生する場合は、プライベート プロパティを定義して値を格納します。これらの値をメソッド内でエラー チェックなしで使用します。クラスの外部からのアクセスの頻度が低い場合は、エラー チェック用のアクセス メソッドを使用するパブリック Dependent プロパティを定義します。

Dependent プロパティで使用されるアクセス メソッドの詳細については、依存プロパティのアクセスメソッドを参照してください。

プロパティの setter メソッドと getter メソッド

プロパティ アクセス メソッドは、プロパティの値がクエリされるか、プロパティに値が代入されるたびに、特定のコードを実行します。これらのメソッドによって、さまざまな処理を実行できます。

プロパティにアクセスできるコードを制御するには、「プロパティの属性」を参照してください。

MATLAB によるアクセス メソッドの呼び出し

    メモ:   プロパティ アクセス メソッドを直接呼び出すことはできません。MATLAB は、プロパティ値にアクセスするときにこれらのメソッドを呼び出します。

プロパティ アクセス メソッドは、アクセス メソッドの外部から対応するプロパティ値を設定したりクエリするたびに、自動的に実行されます。MATLAB はアクセス メソッドを再帰的に呼び出しません。つまり、MATLAB は、その set メソッド内からプロパティを設定するときに set メソッドを呼び出しません。同様に、MATLAB は、その get メソッド内からプロパティ値をクエリするときに get メソッドを呼び出しません。

プロパティの meta.property オブジェクトから、set および get アクセス メソッドの関数ハンドルを取得します。meta.propertySetMethodGetMethod のプロパティには、これらのメソッドを参照する関数ハンドルが含まれています。

アクセス メソッドの制限

プロパティ アクセス メソッドは、次のものだけに定義します。

  • 具象プロパティ (抽象ではないプロパティ)

  • プロパティを定義するクラス内 (このクラスでプロパティが抽象でない場合。抽象の場合は、具象サブクラスでアクセス メソッドを定義しなければなりません)。

MATLAB には、既定の set または get プロパティ アクセス メソッドはありません。したがって、プロパティ アクセス メソッドを定義しないと、MATLAB はプロパティ値を割り当てたり、返す前にメソッドを呼び出しません。

いったんプロパティ アクセス メソッドを定義すると、実際のプロパティ値の設定とクエリは、set メソッドと get メソッドでしか行えません。MATLAB がプロパティの set メソッドを呼び出さない場合の詳細は、set メソッドの動作を参照してください。

    メモ:   プロパティの SetAccess と GetAccess メソッドは、クラスのインスタンスからプロパティ値を設定したりクエリするために使用する、ユーザーによる呼び出しが可能な set メソッドと get メソッドとは等価ではありません。ユーザーによる呼び出しが可能な setget メソッドの詳細は、プロパティの Set/Get インターフェイスの実装を参照してください。

アクセス メソッドではプロパティにアクセスする関数を呼び出せない

プロパティの set または get アクセス メソッド内からに限り、プロパティ値の設定、取得を行うことが可能です。set または get メソッドから他の関数を呼び出すことはできません。その関数から、プロパティ値にアクセスすることはできません。

たとえば、実際の作業を行う他の関数を呼び出す無名関数は、そのプロパティ値にアクセスできません。同様に、アクセス関数は、プロパティ値にアクセスするために他の関数を呼び出すことはできません。

アクセス メソッドを定義する

アクセス メソッドは、プロパティ名を含む固有の名前をもちます。したがって、PropertyName が参照されるたびに get.PropertyName が実行され、PropertyName に値が代入されるたびに set.PropertyName が実行されます。

属性を指定しない methods ブロックでは、プロパティのアクセス メソッドを定義します。これらのメソッドを直接呼び出すことはできません。MATLAB は何らかのコードがプロパティにアクセスしたときにこれらのメソッドを呼び出します。

プロパティ アクセス メソッドは、methods コマンドによって返されるクラス メソッドのリストには現れず、また、meta.class オブジェクトの Methods プロパティには含まれていません。

アクセス メソッドの関数ハンドル

プロパティの meta.property オブジェクトには、プロパティの set および get メソッドの関数ハンドルが含まれています。SetMethod には set メソッドの関数ハンドルが含まれています。GetMethod には get メソッドの関数ハンドルが含まれています。

これらのハンドルを meta.property オブジェクトから取得します。

mc = ?ClassName;
mp = findobj(mc.PropertyList,'Name','PropertyName');
fh = mp.GetMethod;

たとえば、MyClass クラスが Text プロパティの get メソッドを定義する場合、meta.class オブジェクトからこの関数の関数ハンドルを取得できます。

mc = ?MyClass;
mp = findobj(mc.PropertyList,'Name','Text');
fh = mp.GetMethod;

返される値 fh には、指定されたクラスの指定されたプロパティ名に定義された get メソッドの関数ハンドルが含まれます。

関数ハンドルの定義方法についての詳細は、「関数ハンドルの作成」を参照してください。

set および get メソッドの実行とプロパティ イベント

MATLAB は、set と get の操作の前後に、イベントを生成します。これらのイベントを使用すると、プロパティ値が参照または割り当てられたことをリスナーに知らせることができます。イベント生成のタイミングは、以下のとおりです。

  • PreGet — プロパティの get メソッド呼び出し前にトリガーされる

  • PostGet — プロパティの get メソッドが値を返した後でトリガーされる

クラスによってプロパティ値が計算されるとき (Dependent = true)、プロパティの set イベントの動作は get イベントと同様です。

  • PreSet — プロパティの set メソッド呼び出し前にトリガーされる

  • PostSet — プロパティの set メソッド呼び出し後にトリガーされる

プロパティ値が計算されないとき (Dependent = false、既定)、set メソッドを使用した代入ステートメントによって、イベントが生成されます。

  • PreSet — set メソッド内の新しいプロパティ値を割り当てる前にトリガーされる

  • PostSet — set メソッド内の新しいプロパティ値を割り当てた後にトリガーされる

プロパティ イベントの使用についての詳細は、プロパティ リスナーの作成を参照してください。

アクセス メソッドと配列を含むプロパティ

配列を含むプロパティで、プロパティの set および get メソッドに干渉することなく配列インデックスを使用することができます

次のインデックス付き参照について

val = obj.PropName(n);

MATLAB は get メソッドを呼び出して参照された値を取得します。

次のインデックス付き代入について

obj.PropName(n) = val;

MATLAB は以下を行います。

  • get メソッドを呼び出してプロパティ値を取得

  • 返されたプロパティへのインデックス付き代入

  • 新しいプロパティを set メソッドに渡す

アクセス メソッドとオブジェクトの配列

あるオブジェクト配列で参照または代入が行われると、MATLAB は set メソッドと get メソッドをループで呼び出します。このループ内で、MATLAB は常に set と get メソッドにスカラー オブジェクトを渡します。

アクセス メソッドによるプロパティ値の変更

プロパティ値の割り当てや出力の前に、いくつかの追加ステップを実行する必要がある場合、プロパティ アクセス メソッドが役立ちます。たとえば、Testpoint クラスでは、プロパティの set メソッドを使用して値の範囲をチェックします。値が特定の範囲内である場合、スケーリングが適用されます。値が特定の範囲内でない場合、NaN に設定されます。

プロパティの get メソッドは、プロパティの現在の値を返す前にスケール係数を適用します。

classdef Testpoint
   properties
      expectedResult = [];
   end
   properties(Constant)
      scalingFactor = 0.001;
   end
   methods
      function obj = set.expectedResult(obj,erIn)
         if erIn >= 0 && erIn <= 100
            erIn = erIn.*obj.scalingFactor;
            obj.expectedResult = erIn;
         else
            obj.expectedResult = NaN;
         end
      end
      function er = get.expectedResult(obj)
         er = obj.expectedResult/obj.scalingFactor;
      end
   end
end

詳細

この情報は役に立ちましたか?