プロパティ構文
このトピックでは、properties...end
ブロックを使用して、MATLAB® でクラス プロパティを定義する方法を説明し、プロパティ検証の構文と概念を紹介します。また、クラス インスタンスからのプロパティ値の取得と設定に関する基本も説明します。
プロパティ定義ブロック
キーワード properties
と end
は、同じ属性設定をもつ、1 つ以上のクラス プロパティを定義します。以下は、プロパティ ブロックを定義する一般的な構文です。
properties (attributes) propName1 ... propNameN end
メモ
プロパティの名前は、そのクラスと同じ名前や、そのクラスにより定義された他のメンバーの名前と同じであってはいけません。
たとえば、以下のプロパティ ブロックでは、SetAccess
属性を private
に設定した 2 つのプロパティを定義しています。この属性設定は、プロパティ値を設定できるのは PrivateProps
クラスのメンバーのみであることを示しています。
classdef PrivateProps properties (SetAccess = private) Property1 Property2 end end
プロパティに対して、属性が異なる複数のプロパティ ブロックを定義することもできます。以下の例では、1 つのプロパティ ブロックでプライベート SetAccess
をもつプロパティを定義し、2 番目のブロックで抽象プロパティを定義しています。属性が異なるプロパティ ブロックは、クラス定義の中で任意の順序で記述できます。
classdef MultiplePropBlocks properties (SetAccess = private) Property1 Property2 end properties (Abstract) Property3 end end
プロパティの属性の完全な一覧は、プロパティの属性を参照してください。
プロパティ検証構文
プロパティ ブロック内で、プロパティ検証を使用できます。プロパティ検証では、サイズとクラスを含む、各プロパティ値に 1 つ以上の制限を課すことができます。それぞれのプロパティに既定値を指定することもできます。プロパティ検証の一般的な構文は次のとおりです。
properties (attributes) propName1 (dimensions) class {validators} = defaultValue ... end
— プロパティ値のサイズ。(dimensions)
(1,2)
や(1,:)
のように、かっこで囲まれた 2 つ以上の数値のコンマ区切りリストとして指定します。コロンを使用すると、その次元で任意の長さを許可できます。値の次元は
と完全に一致するか、互換性がなければなりません。詳細については、基本的な演算で互換性のある配列サイズを参照してください。(dimensions)
には式を含めることができません。(dimensions)
— プロパティ値のクラス。class
double
など、クラスの名前として指定します。この値は、指定されたクラスまたは変換可能なクラスでなければなりません。たとえば、double
を指定するプロパティは、single
型の値を受け入れ、それらをdouble
に変換します。MATLAB で既に利用できるクラス以外に、独自のクラスをプロパティ検証として使用できます。ユーザー定義のクラスの場合、プロパティ検証により、指定された
のサブクラスをエラーなく渡すことができますが、サブクラスはスーパークラスに変換されません。class
— 検証関数。{validators}
mustBePositive
やmustBeScalarOrEmpty
など、中かっこで囲まれたコンマ区切りリストとして指定します。
とは異なり、検証関数はプロパティ値を変更しません。検証関数は、プロパティ値がその条件と一致しない場合はエラーになります。検証関数の一覧は、プロパティの検証関数を参照してください。独自の検証関数を定義することもできます。class
— 既定のプロパティ値は、指定されたサイズ、クラス、検証ルールに準拠しなければなりません。既定値は式にすることもできます。クラスの初期化は、クラスを最初に使用する直前に発生します。MATLAB が既定値の表現を評価する方法の詳細は、既定値をもつプロパティの定義を参照してください。defaultValue
このクラスは 1 つのプロパティを定義します。プロパティ ブロックには明示的な属性は定義されていません。これはパブリック プロパティのブロックを定義することと同じです。MyPublicData
は正の double のベクトルでなければならず、既定値は [1 1 1]
です。
classdef ValidationExample properties MyPublicData (1,:) double {mustBePositive} = [1 1 1] end end
すべての検証オプションを一度に使用する必要はなく、同じブロック内のそれぞれのプロパティが異なる検証の組み合わせを使用できます。この例では、RestrictedByClass
プロパティはクラス検証のみを使用していますが、RestrictedByFunction
は検証関数を使用し、既定値を代入しています。
classdef DifferentValidation properties RestrictedByClass uint32 RestrictedByFunction {mustBeInteger} = 0 end end
詳細については、プロパティのクラスとサイズの検証とプロパティの検証関数を参照してください。
プロパティ アクセス構文
プロパティにアクセスする構文は、MATLAB 構造体のフィールド構文と類似しています。たとえば、obj
がクラスのオブジェクトであれば、プロパティ名を参照することでプロパティの値を取得できます。
val = obj.PropertyName
等号の左側にプロパティ参照を置くことにより、プロパティに値を代入します。
obj.PropertyName = val
たとえば、ValidationExample
クラスをインスタンス化し、MyPublicData
の値を読み取ります。
classdef ValidationExample properties MyPublicData (1,:) double {mustBePositive} = [1 1 1] end end
x = ValidationExample; x.MyPublicData
ans = 1 1 1
プロパティに対して定義された検証に合格する、新しい値をそのプロパティに代入します。
x.MyPublicData = [2 3 5 7];
この構造体フィールド構文を使用した場合に MATLAB で自動的に呼び出される、get メソッドと set メソッドをオプションで定義できます。詳細については、プロパティ の set メソッドを参照してください。
変数を使用したプロパティの参照
MATLAB は、以下の形式の式を使用して変数 string
または char
からプロパティ名を解決します。
object.(PropertyNameVar)
PropertyNameVar
は、有効なオブジェクト プロパティの名前を含む変数です。この構文は、プロパティ名を引数として渡すときに使用します。たとえば、関数 getPropValue
は KeyType
プロパティの値を返します。
PropName = "KeyType"; function o = getPropValue(obj,PropName) o = obj.(PropName); end