このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
プロパティ値の初期化
プロパティ値を初期化するための基本的な手法は、2 つあります。
既定値をもつプロパティを定義する — MATLAB® では、すべてのインスタンスのプロパティに同じ初期値が代入されます。
コンストラクター内でプロパティ値を設定する — コンストラクターが各インスタンスの代入ステートメントを評価することで、インスタンスは一意の初期プロパティ値をもつことができます。
既定値をもつプロパティの定義
値または式を使用して、既定値を個々のプロパティに代入できます。式に変数を含めることはできません。この例では、プロパティの既定値を定義する方法をいくつか説明します。
classdef PropExample properties Prop1 Prop2 = "some text" Prop3 = sin(pi/12) Prop4 = datetime.empty Prop5 (1,1) double {mustBePositive} = 1 end end
Prop1
— プロパティ定義で既定値が指定されていないため、MATLAB によりプロパティ値が空のdouble
([]
) に初期化されます。Prop2
— 既定値は string スカラー"some text"
です。Prop3
— 既定値はsin(pi/12)
の値です。このプロパティを読み取ると、式そのものではなく、評価された式 (0.2588
) が返されます。既定値として代入する式の評価の詳細については、クラス定義内の式の評価およびオブジェクトを含んだプロパティを参照してください。
Prop4
— 既定値は空のdatetime
オブジェクトです。Prop5
— 既定値は1
で、一般的なプロパティ値はスカラーの正の double に制限されます。プロパティ定義でプロパティ値に対してサイズ、クラス、検証関数の制限が指定されている場合、既定値はこれらの条件を満たさなければなりません。たとえば、既定値が 0 の場合、mustBePositive
を満たしていないため、インスタンス化中にエラーが発生します。サイズ、クラス、および検証関数に基づいたプロパティの制限の詳細については、プロパティ値の検証を参照してください。
メモ
MATLAB では、プロパティ値が最初に必要になったときに (クラスが最初にインスタンス化されるときなど)、既定の式が評価されます。その後、クラスのすべてのインスタンスに対して同じ既定値が使用されます。MATLAB では、クラス定義がメモリからクリアされるまで既定の式は再評価されません。
既定のプロパティ値としてのオブジェクトの処理
ハンドル クラス コンストラクターを使用して既定のプロパティ値を作成すると、MATLAB では、クラスの初回使用時にのみコンストラクターが呼び出され、その後はすべてのインスタンスで、同じオブジェクト ハンドルがプロパティの既定値として使用されます。すべてのオブジェクト ハンドルが同じオブジェクトを参照するため、1 つのインスタンスのハンドル オブジェクトを変更すると、それがすべてのインスタンスのハンドル オブジェクトに反映されます。クラスをインスタンス化するたびにプロパティ値をハンドル オブジェクトの新しいインスタンスで初期化するには、コンストラクター内でプロパティ値を代入します。
コンストラクターでのプロパティ値の設定
クラス コンストラクター内からプロパティに値を代入するには、コンストラクターが返すオブジェクト (出力変数 obj
) と、ドット表記を使用するプロパティ名を参照します。
classdef MyClass properties Prop1 end methods function obj = MyClass(intval) obj.Prop1 = intval; end end end
クラス コンストラクター内で値をプロパティに代入すると、作成した各オブジェクトについて、MATLAB により代入ステートメントが評価されます。そのプロパティに対し各オブジェクトに一意の値が含まれるようにする場合は、コンストラクターでプロパティ値を代入します。
たとえば、ContainsHandle
は、クラス MyHandleClass
の一意のハンドル オブジェクトを各インスタンスの Prop1
に代入します。ContainsHandle
は、それ自体のコンストラクターから MyHandleClass
コンストラクターを呼び出すことでこの処理を行います。
classdef ContainsHandle properties Prop1 end methods function obj = ContainsHandle(keySet,valueSet) obj.Prop1 = MyHandleClass(keySet,valueSet); end end end
コンストラクター メソッドの詳細については、コンストラクターのオブジェクトの参照を参照してください。
構築前のプロパティの検証
MATLAB では、コンストラクターで値が代入される前にプロパティの既定値が検証されます。properties
ブロックで代入された既定値と、クラス コンストラクターでプロパティに設定された値は、指定された検証を満たす必要があります。たとえば、PropInit
は Prop
をスカラーの正の double に制限しますが、既定値は代入しません。既定では、MATLAB により空の double の初期値が代入されます。
classdef PropInit properties Prop (1,1) double {mustBePositive} end methods function obj = PropInit(positiveInput) obj.Prop = positiveInput; end end end
クラス コンストラクターを Prop
に対する有効な値で呼び出しても、Prop
に空の double の初期値が含まれるため、エラーが発生します。空の double は、検証関数 mustBePositive
を満たしません。
obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit': Value must be positive.
この問題を回避するには、コンストラクター内で既定値を上書きする予定であっても、検証を満たす既定値をプロパティに含める必要があります。