ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

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

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

プロパティ アクセス メソッドは、関係付けられたプロパティの値が参照されたり、プロパティに新しい値が割り当てられたりするたびに、特定のコードを実行します。これらのメソッドによって、さまざまな処理を行えます。

  • プロパティの値を割り当てる前に、次のような操作を行うコードを実行する

    • 値の範囲を制限する (「プロパティ値の制限」を参照)

    • 正しい型と次元をチェックする

    • エラー処理を行う

  • プロパティの現在の値を返す前に、次のような操作を行うコードを実行する

プロパティ アクセス メソッドは、オブジェクトのプロパティをクエリしたり、対応するプロパティ値を設定したりするたびに自動的に実行されます。

アクセス メソッドの制限

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

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

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

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

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

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

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

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

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

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

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

属性を指定しないメソッド ブロックでは、プロパティのアクセス メソッドを定義します。これらのメソッドはユーザーによる呼び出しはできません。コードがこのプロパティにアクセスするときに MATLAB によって呼び出されます。したがって、プロパティ アクセス メソッドは、methods コマンドによって返される、クラス メソッドのリストには現れません。さらに、meta.class オブジェクトの Methods プロパティには含まれません。ただし、meta.property オブジェクトの SetMethod プロパティは、プロパティの set メソッドの関数ハンドルを含み、GetMethod プロパティは、プロパティの get メソッドの関数ハンドルを含みます。

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

m = ?myClass;
m.Properties{1}.SetMethod % Assuming Text is the first property in the cell array
ans = 
   @\mydir\@myClass\myClass.m>myClass.set.Text % This is a function handle

meta.class オブジェクト (m) は、Properties プロパティの各クラス プロパティに対応する、meta.property オブジェクトを含みます。この例では、Text プロパティは、meta.property オブジェクトのセル配列において、最初の meta.property オブジェクトに対応するものとします。meta.class Properties プロパティにおけるクラスプロパティの順序は、クラス定義によってプロパティが定義される順序と同じです。

クラスのメタデータ」では、メタクラスの使用方法の詳細を説明します。

Function handlesでは、関数ハンドルの使用方法を説明します。

プロパティ の set メソッド

プロパティの set メソッドは、次の構文をもちます。ここで、PropertyName はプロパティの名前です。

methods % No method attributes
   function obj = set.PropertyName(obj,value) % Value class
end

ここで、obj は、プロパティに値が割り当てられているオブジェクトです。value は、プロパティに割り当てられた新しい値です。

値クラスの関数 set は、割り当てられたプロパティの新しい値をもつオブジェクトを返す必要があります。値クラスは、プロパティが割り当てられているオブジェクトを、set メソッドが返すオブジェクトで置き換えます。ハンドル クラスは、変更されたオブジェクトを返す必要はありません。

methods % No method attributes
   function set.PropertyName(obj,value) % Handle class
end

プロパティの set メソッドは、新しいプロパティ値の保存に必要な動作の前に、入力値のエラー チェックのようなアクションを実行できます。

function obj = set.PropertyName(obj,value)
   if ~(value > 0)
      error('Property value must be positive')
   else
      obj.PropertyName = value;
   end
end

プロパティの set メソッドの例は、「プロパティ値の制限」を参照してください。

set メソッドの動作

プロパティの set メソッドが存在する場合、MATLAB は値がそのプロパティに代入されるたびにメソッドを呼び出します。ただし、次の場合にはプロパティの set メソッドは呼び出されません。

  • プロパティ自体の set メソッドからプロパティに値を代入する場合。set メソッドの再帰呼び出しが回避されます。

  • クラス定義で既定値を指定しても、set メソッドは呼び出されません。

  • 既定値にプロパティを割り当てる場合。既定値はクラス定義で指定します。

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

  • プロパティの AbortSet 属性が true のときに現在値と同じプロパティ値を代入しても、プロパティの set メソッドを呼び出さない。この属性の詳細は、「値が変化しないときに設定を中止」を参照してください。

プロパティ値の割り当て時に、set メソッドに渡されたオブジェクトの呼び出し中の関数のコピーは変更された値を反映します。したがって、1 つのプロパティへの割り当てであっても、オブジェクト全体に影響を与えることが可能です。この動作によって、set メソッドは、指定されたプロパティと同様に、オブジェクト内の他のプロパティも変更できるようになります。

たとえば、グラフィックス ウィンドウ オブジェクトは、Units プロパティと Size プロパティをもつことができます。Units プロパティを変更すると、新しい単位を反映するために Size プロパティの値を変更する必要があります。

プロパティの get メソッド

プロパティ値のクエリ時には、MATLAB によってプロパティの get メソッドが必ず呼び出されます。たとえば、次のステートメントでプロパティ値を渡すと、存在するときにはメソッド get.XYData が実行します。

plot(obj.XYData)

プロパティの get メソッドは、次の構文をもちます。ここで、PropertyName はプロパティの名前です。関数はプロパティ値を返す必要があります。

methods % No method attributes
   function value = get.PropertyName(obj)
end

get メソッドの動作

次の場合、MATLAB はプロパティの get メソッドを呼び出しません。

  • プロパティ自体の get メソッドからプロパティ値を取得する場合。get メソッドの再帰呼び出しが回避されます。

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

依存関係プロパティの set および get メソッド

依存関係プロパティはデータを保存しません。これは、依存関係プロパティの値が他の要素の現在の状態 (具体的なプロパティ値など) に依存しているからです。依存関係プロパティは、クエリ時にプロパティの値を判別するために、get メソッドを定義しなければなりません。

通常、プロパティの get メソッドは、他のプロパティ値をクエリして、依存関係プロパティに返す値を判別します。

たとえば、Account クラスは、Currency プロパティの値に依存する依存関係プロパティ Balance の値を返します。get.Balance メソッドは、Balance プロパティの値を計算する前に Currency プロパティをクエリします。

Balance プロパティがクエリされると、MATLAB は get.Balance メソッドを呼び出します。get.Balance を明示的に呼び出すことはできません。

以下に、依存関係プロパティとその get メソッドを含むクラスの記述の一部を示します。

classdef Account
   properties
      Currency
      DollarAmount
   end
   properties (Dependent)
      Balance
   end
   ...
   methods
      function value = get.Balance(obj)
         c = obj.Currency;
         switch c
            case 'E'
               v = obj.DollarAmount / 1.3;
            case 'P'
               v = obj.DollarAmount / 1.5;
            otherwise
               v = obj.DollarAmount;
         end
         format bank
         value = v;
      end
   end
end

依存関係プロパティの get メソッド

プロパティの get メソッドの 1 つの使用方法として、必要な場合のみプロパティ値を決定し、値を保存しないように設定する方法が挙げられます。この手法を使用するには、プロパティの Dependent 属性を true に設定します。

properties (Dependent = true)
   PropertyName
end

ここで、PropertyName プロパティの get メソッドは、プロパティ値を判定し、メソッド内からオブジェクトに割り当てます。

function value = get.PropertyName(obj)
   value = calculateValue;
   ...
end

この get メソッドは、プロパティ値を計算するために、関数または静的メソッド calculateValue を呼び出し、プロパティにアクセスするコードに value を返します。プロパティの get メソッドは、出力値を生成するためにメソッド内で必要となるアクションを行うことができます。

依存関係プロパティの使用」は、プロパティの get メソッドの例を提供します。

依存関係プロパティをもつ set メソッドを使用するケース

依存関係プロパティはその値を格納しませんが、依存関係プロパティに対して set メソッドを定義するのが適切である状況があります。

たとえば、プロパティの名前を OldPropName から NewPropName に変更するクラスがある場合を考えてみます。古い名前を新しいユーザーに公開せずに、使用を許可し続けるとします。これを行うには、以下の例に示すように、set メソッドをと get メソッドを使用して、OldPropName を依存関係プロパティにします。

properties
   NewPropName
end
properties (Dependent, Hidden)
   OldPropName
end
methods
   function obj = set.OldPropName(obj,val)
      obj.NewPropName = val;
   end
   function value = get.OldPropName(obj)
      value = obj.NewPropName;
   end
end

新旧のプロパティ値を格納することによるメモリの浪費はなく、OldPropName にアクセスするコードは、予想どおりに動作を続けます。

1 つの依存関係プロパティの set メソッドで、オブジェクトの他のプロパティに値を割り当てると便利な場合があります。プロパティの set メソッドから割り当てを行うと、それぞれのプロパティに対して定義された set メソッドが実行されます。例は、「依存関係プロパティの使用」を参照してください。

依存関係プロパティをもつ Private Set アクセス メソッドを使用するケース

値を返すためだけに依存関係プロパティを使用する場合、依存関係プロパティの set アクセス メソッドは定義しないでください。その代わり、依存関係プロパティの SetAccess 属性を private に設定します。たとえば、MaxValue プロパティに対する、以下の get メソッドを考えます。

methods
   function mval = get.MaxValue(obj)
      mval = max(obj.BigArray(:));
   end
end

この例では、MaxValue プロパティを使用して、クエリがあった場合のみに計算される値を返します。この場合、MaxValue プロパティをプライベートな依存関係プロパティとして定義します。

properties (Dependent, SetAccess = private)
   MaxValue
end

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

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

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

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

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

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

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

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

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

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

イベントとリスナー - 概念」は、イベントとリスナーについての一般情報を示します。

プロパティ リスナーの作成」では、プロパティのイベントの使用方法を説明します。

PostSet イベントのリスナー」は、プロパティのリスナーの例を示します。

プロパティ Set リスナーの作成」は、プロパティ イベントを使用する他の例です。

アクセス メソッドと添字参照と割り当て

プロパティの set と get メソッドを妨げることなく、プロパティ値の参照や代入を行うには、添字を使用します (つまり、a = obj.prop(6) または obj.prop(6) = a)。添字参照の使用時には、get メソッドがプロパティ値全体を返し、MATLAB は、そのオブジェクトへの添字で参照される値にアクセスします。

添字を使用した割り当てでは、MATLAB によって以下が実行されます。

  • プロパティ値を得るために get メソッドを呼び出す

  • 返されたプロパティ内で添字を使用した割り当てを実行する

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

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

関連情報については、「オブジェクトを含む読み取り専用プロパティへの割り当て」を参照してください。

プロパティ アクセス メソッドを使用した追加ステップの実行

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

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

classdef Testpoint
   properties (Dependent)
      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
この情報は役に立ちましたか?