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

プロパティの定義

ユーザーが定義できるもの

以下の方法で、プロパティの定義を制御します。

メモ

プロパティはクラスと同じ名前をもつことはできません。

メモ

MATLAB® コードでプロパティ名を使用する際は、必ず大文字と小文字を区別してください。

プロパティ値の初期化

プロパティ値を初期化するための基本的な手法は、2 つあります。

  • プロパティの定義において — MATLAB は、1 回だけ式を評価し、各インスタンスのプロパティに同じ値を割り当てます。

  • クラス コンストラクターにおいて — MATLAB は、各インスタンスに対し代入式を評価します。これにより、各インスタンスが一意の値をもつことが保証されます。

プロパティの既定値として代入する式の評価の詳細については、MATLAB による式の評価を参照してください。

プロパティの既定値

properties ブロック内で、個々のプロパティの既定値を制御できます。既定値を値または MATLAB 式として代入します。式は変数を参照できません。次に例を示します。

  • Prop1 — 代入が無いため既定値は空 []

  • Prop2 — 既定値として文字配列を代入

  • Prop3 — 既定値として式の結果を代入

  • Prop4 — ハンドル クラスと同じインスタンスをこのクラスのすべてのインスタンスの Prop4 に代入

  • Prop5 — 正のスカラー double の指定された制限を満たす既定値を代入

classdef ClassName
   properties
      Prop1
      Prop2 = 'some text'
      Prop3 = sin(pi/12)
      Prop4 = containers.Map 
      Prop5 (1,1) double {mustBePositive} = 1
   end
end

クラス定義で既定のプロパティ値が指定されていない場合、MATLAB はプロパティ値を空の double ([]) に初期化します。クラスでプロパティ値に対してクラス、サイズ、検証関数の制限が指定されている場合、クラスは、空の値が無効なときには有効な値を代入して、既定値が必ずこれらの制限を満たすようにしなければなりません。

メモ

プロパティの既定値の評価は、値が最初に必要になったときにのみ、MATLAB による初回のクラス初期化時に 1 回のみ行われます。MATLAB はクラスのインスタンスが作成されるたびに式を再評価することはありません。

プロパティの既定値として代入する式の評価の詳細については、クラス定義内の式の評価オブジェクトを含んだプロパティを参照してください。

プロパティ定義で使用されるクラス、サイズ、検証関数の詳細については、プロパティ値の検証を参照してください。

プロパティのハンドル オブジェクトへの初期化

MATLAB では、クラス定義を MATLAB が読み込むときに、指定された既定値がプロパティに 1 回だけ代入されます。ハンドル クラス コンストラクターを使用してプロパティの既定値を作成すると、MATLAB はクラスが最初に使用されたときにのみコンストラクターを呼び出し、その後は作成されたすべてのオブジェクトで、同じオブジェクト ハンドルをプロパティの既定として使用します。すべてのオブジェクト ハンドルで同じオブジェクトが参照されるため、1 つのインスタンスでハンドル オブジェクトを変更すると、すべてのインスタンスのハンドル オブジェクトが変更されます。

クラスのオブジェクトを作成するたびにプロパティ値をハンドル オブジェクトの新しいインスタンスに初期化する場合は、プロパティ値をコンストラクターで代入します。

コンストラクターでのプロパティ値の代入

クラス コンストラクター内からプロパティに値を代入するには、コンストラクターが返すオブジェクト (出力変数 obj) とドット表記を使用するプロパティ名を参照します。

classdef MyClass
   properties
      Prop1
   end
   methods
      function obj = MyClass(intval)
         % Initialize Prop1 for each instance
         obj.Prop1 = intval;
      end
   end
end

クラス コンストラクター内でプロパティへの代入を行うと、MATLAB は作成された各オブジェクトについて代入ステートメントを評価します。そのプロパティに対し各オブジェクトに一意の値が含まれるようにする場合は、コンストラクターでプロパティ値を代入します。

たとえば、他のオブジェクトのいずれかを作成するたびに、そのオブジェクトのプロパティに一意のハンドル オブジェクトを割り当てるとします。コンストラクターでプロパティにハンドル オブジェクトを割り当てます。ハンドル オブジェクト コンストラクターを呼び出して、ユーザー クラスの各インスタンスで一意のハンドル オブジェクトを作成します。

classdef ContainsHandle
   properties
       Prop1
   end
   methods
       function obj = ContainsHandle(keySet,valueSet)
           obj.Prop1 = MyHandleClass(keySet,valueSet);
       end
   end
end

コンストラクター メソッドの詳細については、コンストラクターのオブジェクトの参照を参照してください。

オブジェクトの作成前に既定値を評価

MATLAB では、コンストラクターで値が代入される前にプロパティの既定値が検証されます。properties ブロックで代入された既定値と、クラス コンストラクターで設定されたプロパティ値は、指定された検証を満たす必要があります。たとえば、このクラスでは Prop が正のスカラー double に制限されていますが、有効な既定値が代入されていません。既定では、MATLAB で既定値として空の double が代入されるため、実行時エラーが発生します。

classdef PropInit
    properties
        % Error without valid default value
        Prop (1,1) double {mustBePositive} 
        % Empty default fails mustBePositive
    end
    methods
        function obj = PropInit(positiveInput)
            obj.Prop = positiveInput;
        end
    end
end

クラス コンストラクターを Prop に対する有効な値で呼び出すと、検証関数 mustBePositive によりエラーが発生します。

obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit':
Value must be positive.

プロパティの属性

どのプロパティにも、そのプロパティの動作の特性を変更する属性があります。指定された属性は、特定の properties ブロックのすべてのプロパティに適用されます。次に例を示します。

classdef ClassName
   properties (PropertyAttribute = value)
      Prop1
      Prop2
   end
end

たとえば、Salary および Password プロパティの変更とクエリができるのは、同じクラス定義のメソッドだけです。

classdef EmployeeInfo
   properties (Access = private)
      Salary
      Password
   end
end

この制限が存在するのは、クラスによってこれらのプロパティが、Access 属性を private に設定した properties ブロックで定義されているためです。

プロパティの属性

指定できるプロパティの属性の説明については、プロパティの属性を参照してください。

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

MATLAB は、プロパティ値の設定またはクエリ時に常に呼び出しを行います。以下の構文をもつ methods ブロックで、属性を指定せずにプロパティの set アクセス メソッドまたは get アクセス メソッドを定義します。

methods

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

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

end

MATLAB では、プロパティの定義ブロックで指定された既定値を割り当てるときに、プロパティの set アクセス メソッドは呼び出されません。

たとえば、set.Password メソッドは、Password という名前のプロパティに代入された文字配列の長さをテストします。プロパティに代入された値が 7 文字未満の場合、MATLAB はエラーを返します。それ以外の場合、MATLAB は指定された値をプロパティに代入します。

function obj = set.Password(obj,pw)
   if numel(pw) < 7
      error('Password must have at least 7 characters')
   else
      obj.Password = pw;
end

プロパティ アクセス メソッドの詳細については、プロパティ アクセス メソッドを参照してください。

変数を使用したオブジェクト プロパティの参照

MATLAB は、以下の形式の式を使用して char 変数からプロパティ名を解決します。

object.(PropertyNameVar)

ここで、PropertyNameVar は、有効なオブジェクト プロパティの名前を含む変数です。この構文は、プロパティ名を引数として渡すときに使用します。たとえば、関数 getPropValue は KeyType プロパティの値を返します。

PropName = 'KeyType';
function o = getPropValue(obj,PropName)
   o = obj.(PropName);
end

関連するトピック