定数値をもつクラス プロパティの定義
名前付き定数の定義
定数プロパティを定義する MATLAB® クラスを作成することにより、名前により参照できる定数を定義できます。
定数プロパティを使用して、名前でアクセスできる定数値を定義します。プロパティ ブロックで Constant
属性を宣言して、定数プロパティをもつクラスを作成します。Constant
属性を設定すると、そのプロパティ ブロックで指定された値に初期化された後、その値は変更できなくなります。
定数プロパティへの値の割り当て
Constant
プロパティには、MATLAB 式など任意の値を割り当てます。以下に例を示します。
classdef NamedConst properties (Constant) R = pi/180 D = 1/NamedConst.R AccCode = '0145968740001110202NPQ' RN = rand(5) end end
MATLAB は、クラスを読み込むときに式を評価します。そのため、MATLAB が RN
に代入する値は、関数 rand
の単一の呼び出しの結果となり、その後の NamedConst.RN
への参照で変更されることはありません。clear
classes
を呼び出すと、MATLAB がクラスを再度読み込み、定数プロパティを再度初期化します。
定数プロパティの参照
クラス名とプロパティ名を使用して定数を以下のように参照します。
ClassName.PropName
たとえば、前節で定義された NamedConst
クラスを使用するために、定数を度からラジアンに変換した R
を参照します。
radi = 45*NamedConst.R
radi = 0.7854
パッケージの定数
名前を使ってアクセスできる定数値のライブラリを作成するには、まずパッケージ フォルダーを作成し、次に定数を整理するためにさまざまなクラスを定義します。たとえば、天文学の計算に便利な一連の定数を実装するために、constants
という名前のパッケージに AstroConstants
クラスを定義します。
+constants/@AstroConstants/AstroConstants.m
クラスは、割り当てられた値をもつ一連の Constant
プロパティを定義します。
classdef AstroConstants properties (Constant) C = 2.99792458e8 % m/s G = 6.67259 % m/kgs Me = 5.976e24 % Earth mass (kg) Re = 6.378e6 % Earth radius (m) end end
この定数のセットを使用するためにそれらを完全修飾のクラス名で参照してください。たとえば、次の関数は AstroContants
に定義された定数のいくつかを使用します。
function E = energyToOrbit(m,r) E = constants.AstroConstants.G * constants.AstroConstants.Me * m * ... (1/constants.AstroConstants.Re-0.5*r); end
パッケージを関数にインポートすると、パッケージ名を繰り返す必要がなくなります (import
を参照してください)。
function E = energyToOrbit(m,r) import constants.*; E = AstroConstants.G * AstroConstants.Me * m * ... (1/AstroConstants.Re - 0.5 * r); end
ハンドル オブジェクトを代入した定数プロパティ
ハンドル オブジェクトである値をもつ定数プロパティがクラスで定義されている場合、そのハンドル オブジェクトのプロパティに値を代入できます。そのハンドル オブジェクトにアクセスするには、ローカル変数を作成します。
たとえば、ConstMapClass
クラスは定数プロパティを定義します。この定数プロパティの値はハンドル オブジェクトです (containers.Map
オブジェクト)。
classdef ConstMapClass < handle properties (Constant) ConstMapProp = containers.Map end end
Date
キーに現在の日付を代入するには、定数プロパティからハンドルを返し、次に代入ステートメントの左辺のローカル変数を使用して代入を行います。
localMap = ConstMapClass.ConstMapProp
localMap('Date') = datestr(clock);
代入ステートメントの左辺の定数プロパティへの参照は使用できません。たとえば、MATLAB は以下のステートメントを、ConstMapProp
フィールドをもつ ConstMapClass
という名前の struct
を作成するものと解釈します。
ConstMapClass.ConstMapProp('Date') = datestr(clock);
任意のオブジェクトを代入した定数プロパティ
定義クラスのインスタンスを定数プロパティに代入できます。MATLAB は定数プロパティに代入されるインスタンスをクラスの読み込み時に作成します。この手法は、定義クラスが handle
クラスである場合にのみ使用します。
MyProject
はこのようなクラスの一例です。
classdef MyProject < handle properties (Constant) ProjectInfo = MyProject end properties Date Department ProjectNumber end methods (Access = private) function obj = MyProject obj.Date = datestr(clock); obj.Department = 'Engineering'; obj.ProjectNumber = 'P29.367'; end end end
Constant
プロパティを介してプロパティのデータを参照します。
MyProject.ProjectInfo.Date
ans = 18-Apr-2002 09:56:59
MyProject
はハンドル クラスであるため、定数プロパティに代入されるインスタンスのハンドルを取得できます。
p = MyProject.ProjectInfo;
このハンドルを使用して MyProject
クラス内のデータにアクセスします。
p.Department
ans = Engineering
このハンドルを使用して MyProject
クラスの非定数プロパティを変更します。
p.Department = 'Quality Assurance';
p
は、ProjectInfo
定数プロパティに代入されている MyProject
のインスタンスのハンドルです。
MyProject.ProjectInfo.Department
ans = Quality Assurance
クラスをクリアすると、MyProject
の新しいインスタンスが ProjectInfo
プロパティに代入されます。
clear MyProject
MyProject.ProjectInfo.Department
ans = Engineering
プロパティが Constant
として宣言されている場合にのみ、そのプロパティの既定値として定義されているクラスのインスタンスを代入できます。
定数プロパティ — get イベントをサポートしない
定数プロパティは PreGet
プロパティまたは PostGet
イベントをサポートしません。MATLAB は、Constant
プロパティの GetObservable
属性を true
に設定した場合、クラスの初期化中に警告を発行します。